Abdul Manaf
Abdul Manaf

Reputation: 5003

WPF tree view MouseLeftButtonDown event not working

I am new in WPF. I have created a static menu using Tree view in WPF. But left menu click event not triggered. I have the following code.

<UserControl x:Class="navigationApp.dashboard"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:navigationApp"
             mc:Ignorable="d" 
             d:DesignHeight="650" d:DesignWidth="1120">
    <Grid >
        <TreeView>
            <TreeViewItem Header="Dashboard" Name="menuDashboard" MouseLeftButtonDown="menuDashboard_MouseLeftButtonDown"/>
            <TreeViewItem Header="Customer">
                <TreeViewItem Header="Customer Listing" Name="menuCustomerList" MouseLeftButtonDown="menuCustomerList_MouseLeftButtonDown"/>
                <TreeViewItem Header="Add New Customer" Name="menuCustomerReg" MouseLeftButtonDown="menuCustomerReg_MouseLeftButtonDown"/>
            </TreeViewItem>
            <TreeViewItem Header="Settings"/>
        </TreeView>
    </Grid>
</UserControl>

Is any additional code needed?

Upvotes: 0

Views: 332

Answers (2)

Kenneth Parker
Kenneth Parker

Reputation: 101

If TreeViewItem is focusable then the event will be consumed. You can register a global event handler to forward the event again.

static MyClass()
{
    EventManager.RegisterClassHandler(typeof(TreeViewItem),
                    Mouse.PreviewMouseDownEvent,
                           new MouseButtonEventHandler(OnMouseButtonDown), true);
}

So...Just capture the event and re-send. Here I am forwarding to its parent TreeView.

private static void OnMouseButtonDown(object sender, MouseButtonEventArgs e)
{
   var tvi = sender as TreeViewItem;
   var parentTree = tvi.GetParent<TreeView>();
   var eventArgs = new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton)
  {
      RoutedEvent = UIElement.MouseDownEvent,
      Source = sender
   };
   parentTree.RaiseEvent(eventArgs);
   e.Handled = false;
}

Upvotes: 0

mm8
mm8

Reputation: 169420

You could probably use a single SelectedItemChanged event handler:

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    TreeViewItem clickedTreeViewItem = e.NewValue as TreeViewItem;
    //...
}

XAML:

<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
    <TreeViewItem Header="Dashboard" Name="menuDashboard" />
    <TreeViewItem Header="Customer">
        <TreeViewItem Header="Customer Listing" Name="menuCustomerList" />
        <TreeViewItem Header="Add New Customer" Name="menuCustomerReg" />
    </TreeViewItem>
    <TreeViewItem Header="Settings"/>
</TreeView>

Upvotes: 1

Related Questions