WPF TreeView 자동 스크롤 해제: Prevent Automatic Horizontal Scroll

Wookoa 2024. 3. 31.

PHP 슈퍼글로벌 변수 목록
PHP 슈퍼글로벌 변수 목록

머리말

  WPF 프레임워크에서 TreeView 컴포넌트를 사용해 Windows 파일 구조를 개발하던 중 소소한 문제가 발생했다. TreeViewItem을 더블 클릭하면 하위 폴더를 표현하는데, 폴더명이 TreeView 크기를 초과하는 경우 수평 스크롤바가 자동으로 움직이고 있었다. 편의성을 위해 자동으로 움직이도록 설계된 컴포넌트 같지만, 선택한 폴더의 포커싱이 계속 움직여서 오히려 어지러움을 느낄 수 있다. 안타깝게도 간단한 속성으로는 해당 기능을 제어할 수 없었고 약간의 추가 개발이 필요하다. 본 포스팅에서는 TreeView 컴포넌트의 기본 기능을 제거함으로써 수평 스크롤을 방지하는 방법을 소개한다.

TreeView 자동 스크롤 해제

  본인은 Resources 영역에 디자인을 설계한 상태에서 적용했지만 그렇지 않은 경우에도 당연히 적용 가능하다. 입문자를 위해 두 가지 경우를 예시로 설명한다. 디자인 파일(xmal)에서 아래의 예제와 같이 EventSetter 스타일 코드를 추가한다.

Resources 영역에 디자인을 설계한 경우

<UserControl.Resources>
    <Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="RequestBringIntoView" Handler="TreeViewItem_RequestBringIntoView"/>
    </Style>
</UserControl.Resources>

컴포넌트 하위에 디자인을 설계한 경우

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <EventSetter Event="RequestBringIntoView" Handler="TreeViewItem_RequestBringIntoView"/>
        </Style>
    </TreeView.Resources>
</TreeView>

  자신의 개발 스타일에 알맞게 EventSetter 속성을 추가했다면, 아래와 같이 비하인드 코드 파일(.cs)에 TreeViewItem_RequestBringIntoView 이벤트 함수를 정의한다. 코드에 대해서 간단히 설명하자면 디자인 파일에서 추가한 EventSetter 속성의 RequestBringIntoView 이벤트는 TreeView에 아이템이 추가되면 발생되는 이벤트다. 해당 이벤트가 발생하면 Handler에 정의해 놓은 TreeViewItem_RequestBringIntoView 이벤트를 호출한다. 호출되는 TreeViewItem_RequestBringIntoView 이벤트에서는 아이템의 핸들 처리상태를 true 값으로 지정하기 때문에, 스크롤이 자동으로 이동하는 등의 내부 이벤트가 발생하지 않고 그대로 이벤트가 종료된다.

void TreeViewItem_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    e.Handled = true;
}
TreeView자동 스크롤 해제
TreeView자동 스크롤 해제

꼬리말

  간단히 옵션으로 처리가 가능할 것이라 굳게 믿고 며칠 동안 옵션을 찾아 헤맸지만 결론은 옵션 처리가 불가능했다. 아쉽지만 본인도 위에 설명한 방법으로 개발을 진행하고 있다. 비교적 간단한 방법으로 처리가 가능했지만 추후에 컴포넌트 이벤트가 의도치 않게 발생할 경우 유심히 지켜봐야 할 것 같다. WPF 프레임워크의 TreeView 컴포넌트에서 자동으로 수평 스크롤을 방지하는 방법에 대해서 소개한 본 포스팅은 이로써 마무리 짓도록 한다.

인기있는 글

소중한 댓글 (0)