Как игнорировать щелчок мыши на расширителе TreeViewItem, используя событие PreviewMouseLeftButtonDown в WPF? - PullRequest
0 голосов
/ 10 ноября 2019

В моем приложении есть TreeView

        <TreeView

            ...

            <TreeView.ItemContainerStyle>
                <Style 
                    TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                    <Setter Property="Margin" Value="0, 2"/>
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnMouseLeftButtonClicked"/>
                </Style>
            </TreeView.ItemContainerStyle>

            <TreeView.ItemTemplate>

                <HierarchicalDataTemplate 
                    ItemsSource="{Binding Children}">

                    <StackPanel 
                        Orientation="Horizontal">
                        <Image 
                            VerticalAlignment="Center"
                            Width="20"
                            Height="20"
                            Source="{Binding Type, Converter={StaticResource ItemTypeToImageConverter}}"/>
                        <TextBlock 
                            FontSize="16"
                            Foreground="White"
                            FontFamily="{StaticResource Dosis}"
                            Margin="10, 0"
                            VerticalAlignment="Center" 
                            Text="{Binding Name}"/>
                    </StackPanel>

                </HierarchicalDataTemplate>

            </TreeView.ItemTemplate>

        </TreeView>

Обработчик OnMouseLeftButtonClicked:

protected void OnMouseLeftButtonClicked(object sender, MouseButtonEventArgs args)
{

    ...

}

Я хотел бы выполнить некоторые действия, определенные в обработчике, только если пользователь нажал на дерево. содержимое элемента, но не при нажатии на расширитель. Как отличить источник клика?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Простое решение, которое я нашел. Я обернул содержимое HierarchicalDataTemplate в рамку, как вы можете видеть в приведенном ниже коде:

                <HierarchicalDataTemplate
                    ItemsSource="{Binding Children}">

                    <Border
                        Background="Transparent"
                        BorderThickness="0"
                        MouseDown="OnMouseLeftButtonClicked">
                        <StackPanel 
                            Orientation="Horizontal">
                        <Image 
                            VerticalAlignment="Center"
                            Width="20"
                            Height="20"
                            Source="{Binding Type, Converter={StaticResource ItemTypeToImageConverter}}"/>
                        <TextBlock 
                            FontSize="16"
                            Foreground="White"
                            FontFamily="{StaticResource Dosis}"
                            Margin="10, 0"
                            VerticalAlignment="Center" 
                            Text="{Binding Name}"/>
                        </StackPanel>
                    </Border>

                </HierarchicalDataTemplate>

Все, что вам нужно, - это преобразовать отправителя в Border, а затем использовать его свойства для обработки события.

0 голосов
/ 10 ноября 2019

Что касается меня, я использую немного другую структуру для XAML, я вставляю ее, чтобы вы могли адаптировать ее к вашему случаю:

<TreeView BorderThickness="0" ItemsSource="{Binding RepereTree}" Width="200" Background="Transparent">
    <TreeView.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
    </TreeView.Resources>
    <TreeView.ItemTemplate>
        <DataTemplate>
            <TreeViewItem  ItemsSource="{Binding ListeSubReperes}">
                <TreeViewItem.Header>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Background="Transparent" Foreground="#FF042271" Text="{Binding NameOri}" HorizontalAlignment="Left" VerticalAlignment="Center" MouseMove="mouseOverNameRepere" ToolTip="{Binding Path=ToolTipModifications}" MouseDown="TreeView_Main"/>
                    </Grid>
                </TreeViewItem.Header>
                <TreeViewItem.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="-20,0,0,0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <TextBlock Background="{StaticResource WindowBackgroundColor}" Foreground="#FF042271" Text="{Binding Name}" Margin="10,0,0,0" HorizontalAlignment="Left" Tag="{Binding IdRepereOri}" VerticalAlignment="Center" Grid.Column="0" MouseDown="TreeView_Sub"/>
                            <!--<TextBlock Foreground="#FF042271" Text="{Binding IdRepereOri}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>-->
                        </Grid>
                    </DataTemplate>
                </TreeViewItem.ItemTemplate>
            </TreeViewItem>
        </DataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Как видите, я установил две разные функции MouseDown="TreeView_Main" иMouseDown="TreeView_Sub" относительно того, нажал ли пользователь на Элемент или Подэлемент. в вашем случае будет достаточно удалить "TreeView_Sub"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...