WPF에서는 마우스 오른쪽 버튼으로 커서 아래의 TreeView 항목을 어떻게 선택합니까?

StackOverflow https://stackoverflow.com/questions/797966

  •  18-09-2019
  •  | 
  •  

문제

WPF에서 TreeView 항목을 마우스 오른쪽 버튼으로 클릭하면 컨텍스트 메뉴를 표시하기 전에 선택/활성화하려고합니다.

이것은 매우 간단하게 들리지만 HierachicalDataTemplate의 포함은 사물을 조금 복잡하게 만듭니다.

다음 treeview가 있습니다.

<TreeView 
            x:Name="trv"
            ContextMenu="{StaticResource contextMenu}"
            ItemTemplate="{StaticResource treeHierarchicalDataTemplate}"
            ItemsSource="{Binding Source={StaticResource meetingItems}}" >

            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="trv_PreviewMouseRightButtonDown"/>
                    <Setter Property="IsExpanded" Value="True"></Setter>
                </Style>
            </TreeView.ItemContainerStyle>
        </TreeView>

그리고 여기 내 이벤트 핸들러가 있습니다 ...

private void trv_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem item = sender as TreeViewItem;
    if (item != null)
    {
        item.Focus();
        e.Handled = true;
    }

}

위의 이벤트 세터를 추가하는 방법에 유의하십시오. 이것은 거의 작동합니다. 그러나 루트 레벨 트리 뷰 노드 만 선택합니다 (즉, 마우스 오른쪽 버튼을 클릭 한 노드의 루트 부모). 이것은 계층 적 데이터 템플릿 때문일 수 있습니까? 이 템플릿에는 동일한 유형의 어린이가 포함될 수 있습니다.

여기 내 계층 적 데이터 템플릿이 있습니다 ...

<HierarchicalDataTemplate x:Key="treeHierarchicalDataTemplate" 
                          ItemsSource="{Binding Path=ChildMeetingItems}">
    <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Red}" Value="True">
            <Setter TargetName="img" Property="Image.Source" Value="pack://siteoforigin:,,,/images/bookRed.png"></Setter>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
    <StackPanel 
        x:Name="treeViewItemPanel"
        Background="Transparent"
        Orientation="Horizontal">
        <Image Width="16" Height="16"  x:Name="img" Margin="0,0,4,0" Source="pack://siteoforigin:,,,/images/bookGreen.png"></Image>
        <TextBlock Foreground="DarkGray" Text="{Binding DisplayIndex}" Margin="0,0,5,0"></TextBlock>
        <TextBlock Text="{Binding Summary}"></TextBlock>
    </StackPanel>
</HierarchicalDataTemplate>

마우스 오른쪽 버튼을 클릭하면 하위 노드 대신 루트 노드 만 선택한 이유에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

itemcontainerstyle은 자식 노드에 의해 상속되지 않기 때문입니다. ItemContainerstyle O 귀하의 계층 구조에 동일한 이벤트 세터를 추가해야합니다.

<HierarchicalDataTemplate x:Key="treeHierarchicalDataTemplate" 
                          ItemsSource="{Binding Path=ChildMeetingItems}">
    <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Red}" Value="True">
            <Setter TargetName="img" Property="Image.Source" Value="pack://siteoforigin:,,,/images/bookRed.png"></Setter>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
    <StackPanel 
        x:Name="treeViewItemPanel"
        Background="Transparent"
        Orientation="Horizontal">
        <Image Width="16" Height="16"  x:Name="img" Margin="0,0,4,0" Source="pack://siteoforigin:,,,/images/bookGreen.png"></Image>
        <TextBlock Foreground="DarkGray" Text="{Binding DisplayIndex}" Margin="0,0,5,0"></TextBlock>
        <TextBlock Text="{Binding Summary}"></TextBlock>
    </StackPanel>

<HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="trv_PreviewMouseRightButtonDown"/>                    
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>

다른 팁

그냥 댓글을 달아라 e.Handler=true 이벤트 핸들러에서.

이와 같이:

private void trv_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem item = sender as TreeViewItem;
    if (item != null)
    {
        item.Focus();
       // e.Handled = true;
    }

}

나는 같은 문제가있었습니다 - 선택한 트리 항목을 얻을 수 없었습니다. 그리고 사용하는 대신 PreviewMouseRightButtonDown 이벤트 나는 같은 이벤트를 사용했습니다 StackPanel 필요한 모든 데이터를 저장합니다.

<StackPanel DataContext="{Binding}" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
....
</StackPanel>

그리고 이벤트 핸들러 코드-비만 :

 private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            StackPanel panel = sender as StackPanel;
            if(panel==null)return;
            MyTreeViewItem myClicked = panel.DataContext as MyTreeViewItem;
            if (myClicked == null) return;
...
}

MyTreeViewItem 데이터에 대한 내 사용자 지정 유형입니다. myClicked 이제 클릭 된 트리 항목과 관련된 데이터를 저장합니다. 나와 같은 사람이 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top