События мыши в Treeview

#c# #wpf #xaml #treeview #mouseevent

#c# #wpf #xaml #просмотр дерева #mouseevent

Вопрос:

Я хочу в окне wpf установить treeview и использовать его через события мыши. В частности, я хотел бы, чтобы сложная фигура рисовалась на холсте щелчком мыши по каждому элементу treeview. Однако я не уверен, что treeview может служить этой цели, поскольку созданная мной реализация, похоже, вообще не работает. События мыши не работают (делегаты не запускаются). Может ли кто-нибудь указать мне причину? Взгляните на код:

 <TreeView DockPanel.Dock="Left" Background="DarkGray" HorizontalAlignment="Left" VerticalAlignment="Top">
    <TreeViewItem Header="Input Data">
        <TreeViewItem Header="Vector" MouseEnter="create_Rhombus"/>
        <TreeViewItem Header="Array"/>
    </TreeViewItem>
    <TreeViewItem Header="Maths">
        <TreeViewItem Header="Add" MouseDown="create_AddRectangle"/>
        <TreeViewItem Header="Subtract" MouseDown="create_SubtractRectangle"/>
        <TreeViewItem Header="Multiply" MouseDown="create_MultiplyRectangle"/>
        <TreeViewItem Header="Divide" MouseDown="create_DivideRectangle"/>
    </TreeViewItem>
</TreeView>
  

Методы в коде, лежащем в основе файла, являются:

 private void create_AddRectangle(object sender, MouseButtonEventArgs e)

private void create_SubtractRectangle(object sender, MouseButtonEventArgs e)
  

….

Однако вышеуказанные методы не вызываются. Почему?

Ответ №1:

Предположительно, из-за функциональности выбора событие мыши помечается как обработанное внутри. Попробуйте вместо этого использовать туннельные версии таких событий (т. Е. PreviewMouseDown ).

Ответ №2:

Я думаю, что может быть ошибка с использованием туннелирования (ie PreviewMouseDown ). Я реализовал это, и оно срабатывает правильно, но если я попытаюсь получить доступ к DataContext, я получу {DisconnectedItem} объект. Судя по тому, что я прочитал в Интернете, это ошибка с WPF.

Я обнаружил, что могу подключить MouseLeftButtonDown и MouseRightButtonDown события для одного TreeViewItem к одному и тому же методу, и он будет работать точно так же, как вы ожидаете, что MouseDown событие будет работать.