WPF UI 관련 질문입니다.

넵, XAML만이라도 Gist 같은 곳에 올려주시면 될 것 같습니다.

열리실까요? WPF 기본 데스크톱 앱 생성 후 Grid 내에 해당 코드 복붙 하면 될 것 같습니다.

XAML 코드가 이 정도로 길 줄은 상상도 못했네요. :sweat_smile::sweat_smile:

일단 제 환경에서는 눈에 띄는 멈춤 현상은 나타나지 않는 것 같습니다. 다만, 최초에 콤보박스가 열릴 때 약 1~2초 정도 멈추는 현상이 보여 호출 스택을 확인해 보니 AutomationPeer 관련 코드가 실행되고 있는 것을 확인했습니다.

콤보박스 드롭다운이 열리는 순간, AutomationPeer가 메인 윈도우의 하위 요소를 탐색하며 정보를 취합하는 것으로 보이는데, 하위 요소가 워낙 많다 보니 환경에 따라 상당한 시간이 소요되는 것 같습니다.

image

그래서 AutomationPeer를 비활성화할 수 있는 방법을 찾아 봤는데요, 아래 링크에서 답변을 얻었습니다.


먼저 프로젝트에 아래 클래스를 추가합니다.

using System.Collections.Generic;
using System.Windows;
using System.Windows.Automation.Peers;

namespace ComboBoxFreezeTest
{
	public class SuppressAutomationPeer : FrameworkElementAutomationPeer
	{
		public SuppressAutomationPeer(FrameworkElement owner) : base(owner) { }

		protected override string GetNameCore()
		{
			return nameof(SuppressAutomationPeer);
		}

		protected override AutomationControlType GetAutomationControlTypeCore()
		{
			return AutomationControlType.Window;
		}

		protected override List<AutomationPeer> GetChildrenCore()
		{
			return new List<AutomationPeer>();
		}
	}
}

그리고 최상위 메인 창의 OnCreateAutomationPeer() 메서드를 재정의하여 위 코드의 SuppressAutomationPeer 인스턴스를 반환하게 합니다.

using System.Windows.Automation.Peers;

namespace ComboBoxFreezeTest
{
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
		}

		protected override AutomationPeer OnCreateAutomationPeer()
		{
			return new SuppressAutomationPeer(this);
		}
	}
}

이렇게 적용하면 최초의 약간의 멈춤 현상이 사라지는 것을 확인할 수 있었습니다.

한번 테스트해 보시고 피드백 부탁드립니다.


여담

첨부해 주신 XAML 코드는 개선이 필요해 보입니다. 현재 코드 양이 많아 수정, 빌드, 디버깅에도 상당한 시간이 소요될 것으로 예상됩니다.

적절한 레이아웃 패널과 스타일을 활용하면 소스 코드의 80% 정도를 줄일 수 있을 것 같습니다.
프로덕션 코드라면 AI의 도움을 받아 한 번 정리해 보시는 것도 좋은 방법일 듯합니다.

이상입니다.

6개의 좋아요

너무너무 감사합니다 아직 테스트는 못해봤는데 최대한 빨리 적용해보겠습니다.

XAML 코드가 많은건 저도 고민인데 AI 도움이든 아니면 Window나 Page로 분할을 해볼려고 시도 하고 있습니다.

테스트 후에 결과도 공유 드리겠습니다

jj1uE
TextBlock 도배에 순간 멍해졌네요
PropertyGrid 같은 컨트롤 쓰는 게 좋겠습니다.

사용하는 항목이 많다보니 텍스트블럭이 많을 수 밖에 없었습니다.

말씀해주신 프로퍼티그리드 라는 것도 한번 활용해볼께요

텍스트블럭을 데이터그리드로 대체 한 것도 꽤 있는데 UI 레이아웃을 사용자가 원하는대로 하려다보니 텍스트블럭을 대량으로 쓸 수밖에 없었네요

1개의 좋아요

처음 콤보박스 실행할 때 버퍼링 없어 지는 것 확인 했습니다 정말정말 감사합니다!

4개의 좋아요

1~2초 정도 멈추는 현상의 호출스택을 어떻게 확인하셨나요?

image

어플리케이션에서 콤보박스의 동작이 1~2초 동안 지연되는 순간, 비주얼 스튜디오에서 [모두 중단]을 선택하여 수동으로 디버깅을 중단했고,
호출 스택의 컨텍스트 메뉴에서 [외부 코드 보기]를 활성화하면 [외부 코드]로 표시된 항목까지 확인할 수 있습니다.

이 내용을 질문하신 것이 맞으신가요?

1개의 좋아요

네 맞습니다! 감사합니다 !!

1개의 좋아요