Hi,@BabyHai . You could check if the effect below is what you want. If so, you can refer to the following code.
Question 1:
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:ViewItem}" ItemsSource="{Binding Path=ViewItems}">
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="MyControl" Text="{Binding Path=ItemName}" Margin="0,0,10,0" />
</StackPanel>
</HierarchicalDataTemplate>
<ContextMenu x:Key="FirstLevelContextMenu" Focusable="False">
<MenuItem Header="Ctx1" Focusable="False"></MenuItem>
<MenuItem Header="Ctx2" Focusable="False"></MenuItem>
<MenuItem Header="Ctx3" Focusable="False"></MenuItem>
</ContextMenu>
</TreeView.Resources>
Codebehind:
private TreeViewItem lastClickedItem = null;
private void AssociatedObject_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
TreeViewItem tvi = FindAnchestor<TreeViewItem>((DependencyObject)e.OriginalSource);
if (tvi != null)
{
if (lastClickedItem != null && !lastClickedItem.Equals(tvi))
{
lastClickedItem.Background = Brushes.White;
}
if (FindTreeLevel(tvi) == 0)
{
// Display the context menu for first-level items
ContextMenu contextMenu = tvi.FindResource("FirstLevelContextMenu") as ContextMenu;
if (contextMenu != null)
{
contextMenu.PlacementTarget = tvi;
contextMenu.IsOpen = true;
}
}
tvi.Background = Brushes.MediumPurple;
lastClickedItem = tvi;
}
}
}
private int FindTreeLevel(DependencyObject control)
{
var level = -1;
if (control != null)
{
var parent = VisualTreeHelper.GetParent(control);
while (!(parent is TreeView) && (parent != null))
{
if (parent is TreeViewItem)
level++;
parent = VisualTreeHelper.GetParent(parent);
}
}
return level;
}
The result:
Question 2:
Why do you need to right-click or Collapse TreeviewItems if you want to use the right mouse button to click on other controls? TreeviewItems can collapse when clicking the left mouse button.
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.