C#, Button UI 이벤트 제어하기
버튼을 클릭하고 이벤트 핸들러에서 내용을 처리 중일 때는 버튼을 잠시 잠그고 처리 완료 후 버튼의 잠금을 해제하여 이중 클릭 방지와 처리 과정이 동작 중임을 가시적으로 표현하곤 한다. 이 때에 필요한 방법을 4가지 정도로 소개할까 한다. 테스트 환경은 .NET 8.0 WPF 이다.
일반적으로 간단하게 처리하고자 한다면 아래와 같이 코드를 작성할 것이다.
개선 전 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void ButtonOnTest(object sender, RoutedEventArgs e)
{
if (sender is not Button btn)
{
return;
}
string? orgContent = btn.Content?.ToString();
try
{
btn.Content = "처리중...";
btn.IsEnabled = false;
// 해당 작업이 있다고 가정
Thread.Sleep(5000);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); // Log처리 가정
}
finally
{
btn.Content = orgContent;
btn.IsEnabled = true;
}
}
위의 코드는 문제가 2가지 정도 있는데 하나는 동작 중에 화면이 잠기는 것이고 두 번째는 이중 클릭을 방지할 수 없다는 것이다. 아래의 코드는 비동기 방식으로 처리하여 간단하게 개선한 것이다.