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
'C# > C# WPF 실무' 카테고리의 다른 글
[C# WPF] 트리뷰(TreeView)에서 파일 추가 버튼 클릭 시, xml 파일 생성하기 (0) | 2023.09.19 |
---|---|
[C# WPF] 복사하기 버튼을 통해 복사하기 (0) | 2023.09.18 |
[C# WPF] 프로젝트 내 폴더로 파일 탐색기 만들기 (0) | 2023.09.13 |
[C# WPF] XML 에서 자식 노드 명과 자식 노드 값 가져오기 (0) | 2023.09.11 |
[C# WPF] Oracle DB연동하기 (2) | 2023.09.07 |