WPF에서 텝이 변결될 때 발생하는 이벤트 키워드인 SelectionChanged를 TabControl에 사용해서 탭을 가져오는 형태로 코드구성을 진행하는 중 이상한 점이 발견됬다.
내가 만드는 프로그램에서는 2번째 탭을 클릭하면 SelectionChanged가 호출 되고 2번째 탭 내의 ListBox 컨텐츠가 업데이트 되는 형식으로 코드가 진행될 것으로 예상하고 디버그를 하였으나, 실제로는 2번째 탭을 클릭하면 SelectionChanged가 재귀적으로 무한호출 되버리는 문제가 발생되었다.
문제는 TabControl 내부에 컨텐츠가 업데이트 되거나 무슨 변화가 존재할 경우에도 해당 이벤트가 호출된다는 점이다. 이럴 대는 Source 값이 TabControl인지 비교하는 항목이 추가되야 하며 아래와 같은 코드구성이 가능하다.
private void MainTabChanged(object sender, SelectionChangedEventArgs e) |
{ |
int tabItem = ((sender as TabControl)).SelectedIndex; |
if (e.Source is TabControl) // This is a soultion of those problem. |
{ |
switch (tabItem) |
{ |
case 0: // Chatting |
Debug.WriteLine("Tab: Chatting"); |
if (MainChatList.Items.Count > 0) |
{ |
MainChatList.SelectedIndex = MainChatList.Items.Count - 1; |
MainChatList.ScrollIntoView(MainChatList.Items[MainChatList.Items.Count - 1]); |
} |
break; |
case 1: // Users |
Debug.WriteLine("Tab: Users"); |
break; |
case 2: // Friends |
Debug.WriteLine("Tab: Friends"); |
this.OnFriendTabActive(); |
break; |
default: |
Debug.WriteLine("Tab: " + tabItem); |
break; |
} |
} |
} |
소스의 4번째 줄을 확인하면 TabControl의 문제점을 개선하는 코드를 확인 할 수 있다.
if (e.Source is TabControl)<--로 확인가능
'wpf' 카테고리의 다른 글
Combox 에 Enum 바인딩 (0) | 2021.05.06 |
---|---|
WPF에서 기본적으로 제공해주는 BoolToVisConverter 컨버터 (0) | 2020.04.28 |
이벤트 중복 호출 되지 않게 하는법 (0) | 2019.04.24 |
list depp copy , clone 하는 간단한 방법 (0) | 2019.03.21 |
OpenCV, Face API를 이용해서 얼굴 검출하기 2번째 (0) | 2019.02.26 |