[C# WPF] TreeView 아이콘 적용 및 하위노드 더블클릭 시 이벤트 발생

728x90

 

 

자료가 없어서 진짜 한참을 뒤졌다...

참고 : https://icodebroker.tistory.com/3156#google_vignette

위 블로그대로 하니 트리거로 인해 트리가 펼쳐질 때 아이콘이 바뀌기는 하지만..
최하위 노드 클릭 시 아이콘이 변경된다는 문제점과 , 잘 들어가있던 더블클릭 이벤트가 발생하지 않는다는 문제점이 발생했다.

 

1. 첫 번째 시도

    <UserControl.Resources>
        <Style x:Key="{x:Type TreeView}" TargetType="TreeView">
            <Setter Property="Padding" Value="3 3 3 3"/>
            <Setter Property="Margin" Value="3 3 3 3"/>
        </Style>
        <Style x:Key="{x:Type TreeViewItem}" TargetType="TreeViewItem">
            <Setter Property="Margin" Value=" 0 3 0 3"/>
            <EventSetter Event="MouseDoubleClick" Handler="file_DoubleClick"/>
        </Style>
    </UserControl.Resources>
    
        <Grid>
        <TreeView Name="treeView"
            HorizontalAlignment="Left"
            Width="280">
            <TreeView.Style>
            <TreeView.Resources>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="HeaderTemplate">
                        <Setter.Value>
                            <HierarchicalDataTemplate >
                                <StackPanel Orientation="Horizontal">
                                    <Image Name="img" 
                                           Width="20" Height="20"
                                           Stretch="Fill" 
                                           Source= "/Images/file_icon.png"/>
                                    <TextBlock Text="{Binding}" Margin="3,0"/>
                                </StackPanel>

                                <HierarchicalDataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}, 
                                                 Path=HasItems}" Value="True">
                                        <Setter TargetName="img" 
                                                Property="Image.Source" 
                                                Value="/Images/folder_close_icon.png"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                 Path=IsExpanded}" Value="True">
                                        <Setter TargetName="img" 
                                                Property="Image.Source" 
                                                Value="/Images/folder_open_icon.png" />
                                    </DataTrigger>
                                </HierarchicalDataTemplate.Triggers> 
                            </HierarchicalDataTemplate >
                        </Setter.Value>
                    </Setter>
                </Style>
            </TreeView.Resources> 
            ...

이런식으로 넣으니까 이벤트 처리가 작동이 안됐다.

 

2. 두 번째 시도 

    <UserControl.Resources>
        <Style x:Key="{x:Type TreeView}" TargetType="TreeView">
            <Setter Property="Padding" Value="3 3 3 3"/>
            <Setter Property="Margin" Value="3 3 3 3"/>
        </Style>
        <Style x:Key="{x:Type TreeViewItem}" TargetType="TreeViewItem">
            <Setter Property="Margin" Value=" 0 3 0 3"/>
            <EventSetter Event="MouseDoubleClick" Handler="file_DoubleClick"/>
        </Style>
    </UserControl.Resources>
    
        <Grid>
        <TreeView Name="treeView"
            HorizontalAlignment="Left"
            Width="280">
            <TreeView.Style>
            <TreeView.Resources>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="HeaderTemplate">
                        <Setter.Value>
                            <HierarchicalDataTemplate >
                                <StackPanel Orientation="Horizontal">
                                    <Image Name="img" 
                                           Width="20" Height="20"
                                           Stretch="Fill" 
                                           Source= "/Images/file_icon.png"/>
                                    <TextBlock Text="{Binding}" Margin="3,0"/>
                                </StackPanel>

                                <HierarchicalDataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}, 
                                                 Path=HasItems}" Value="True">
                                        <Setter TargetName="img" 
                                                Property="Image.Source" 
                                                Value="/Images/folder_close_icon.png"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                 Path=IsExpanded}" Value="True">
                                        <Setter TargetName="img" 
                                                Property="Image.Source" 
                                                Value="/Images/folder_open_icon.png" />
                                    </DataTrigger>
                                </HierarchicalDataTemplate.Triggers> 

                             <!--   MouseDoubleClick 이벤트 처리 -->
                                <HierarchicalDataTemplate.ItemContainerStyle>
                                    <Style TargetType="{x:Type TreeViewItem}">
                                        <EventSetter Event="MouseDoubleClick" Handler="file_DoubleClick"/>
                                    </Style>
                                </HierarchicalDataTemplate.ItemContainerStyle>
                            </HierarchicalDataTemplate >
                        </Setter.Value>
                    </Setter>
                </Style>
            </TreeView.Resources> 
            ...

 

이렇게 해도 안됨

 

3. 세 번째 시도

그래서 직접 스타일을 넣어줬다

    <Grid>
        <TreeView Name="treeView"
            HorizontalAlignment="Left"
            Width="280">
            <TreeView.Style>
                <Style TargetType="TreeView">
                    <Setter Property="Padding" Value="3 3 3 3"/>
                    <Setter Property="Margin" Value="3 3 3 3"/>
                </Style>
            </TreeView.Style>

            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="Margin" Value=" 0 3 0 3"/>
                </Style>
            </TreeView.ItemContainerStyle>

            <TreeView.Resources>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="MouseDoubleClick" Handler="file_DoubleClick"/>
                    <Setter Property="HeaderTemplate">
                        <Setter.Value>
                            <HierarchicalDataTemplate >
                                <StackPanel Orientation="Horizontal">
                                    <Image Name="img" 
                                       Width="20" Height="20"
                                       Stretch="Fill" 
                                       Source= "/Images/file_icon.png"/>
                                    <TextBlock Text="{Binding}" Margin="3,0"/>
                                </StackPanel>
                                <HierarchicalDataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}, 
                                                 Path=HasItems}" Value="True">
                                        <Setter TargetName="img" 
                                                Property="Image.Source" 
                                                Value="/Images/folder_close_icon.png"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                 Path=IsExpanded}" Value="True">
                                        <Setter TargetName="img" 
                                                Property="Image.Source" 
                                                Value="/Images/folder_open_icon.png" />
                                    </DataTrigger>
                                </HierarchicalDataTemplate.Triggers>
                            </HierarchicalDataTemplate >
                        </Setter.Value>
                    </Setter>
                </Style>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</UserControl>

 

    public partial class QueryTreePanel : UserControl
    {
    
        //클릭이벤트
        private void file_DoubleClick (object sender, MouseButtonEventArgs e)
        {
            TreeViewItem item = sender as TreeViewItem;


            if(item != null)
            {
                if (QueryTreeViewModel.IsFileNode(item))
                {
                    //클릭 이벤트 발생 시 작동 될 코드 작성 
                }
            }
        }

 

    public class QueryTreeViewModel
    {        //자식노드가 있는지 확인 ( 이름에 .xml이 들어가면 가장 하위노드임)
        public bool IsFileNode(TreeViewItem item)
        {
            return item.Header.ToString().EndsWith(".xml");
        }

 

 

728x90