Загадочный стиль WPF TreeViewItem при наведении курсора мыши

Я в замешательстве по этому поводу, я провел большую часть последних двух дней, играя с этим и гугля. Когда я навожу указатель мыши на свой TreeView, он работает, как и ожидалось, пока вы не перейдете Expander/текст в этот момент, будут применены другой фон и кисть границы. Я глупо пытался устранить это, и, похоже, ничего не работает. Моя последняя попытка избыточного убийства ниже оставила меня без понятия, что происходит.

Я предполагаю, что это что-то простое, что просто пролетает над моей головой, и я знаю, что это глупое количество триггеров не требуется.

В соответствии с просьбой, вот скриншот Проблема

И что желательно, так это эффект, который вы видите там, где текст синий, а фон прозрачный. Фоновая и граничная кисть поверх расширителя не нужна.

<TreeView x:Name="textureTreeView" ItemsSource="{Binding Category}"  Margin="0" SelectedItemChanged="textureTreeView_SelectedItemChanged" Background="#00000000" BorderBrush="{x:Null}" Foreground="#00000000" IsTextSearchEnabled="True">

    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local1:CategoryViewModel}" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" IsHitTestVisible="False"/> <!-- This eliminated the text from causing the issue -->
            </StackPanel>
        </HierarchicalDataTemplate>

    </TreeView.Resources>

    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Foreground" Value="#FFA1A1A1"/>
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
            <Setter Property="FontWeight" Value="Normal"/>
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                        <Setter Property="Foreground" Value="#FFFFFFFF"/>
                    </Trigger>

                    <Trigger Property="Expander.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>

                    <Trigger Property="Grid.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>
                    <Trigger Property="StackPanel.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>
                    <Trigger Property="TextBlock.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>
                    <Trigger Property="ItemsPresenter.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>
                    <Trigger Property="Path.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>
                    <Trigger Property="ToggleButton.IsMouseOver" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>
                    <Trigger Property="ToggleButton.IsChecked" Value="true">
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </Trigger>

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition   Property="IsMouseOver" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition   Property="ToggleButton.IsMouseOver" Value="true"/>
                            <Condition Property="ToggleButton.IsChecked" Value="true"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"  Value="#00000000"/>
                        <Setter Property="BorderBrush" Value="#00000000"/>
                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                    </MultiTrigger>
                    <MultiTrigger>
                         <MultiTrigger.Conditions>
                             <Condition   Property="ToggleButton.IsMouseOver" Value="true"/>
                             <Condition Property="ToggleButton.IsChecked" Value="false"/>
                         </MultiTrigger.Conditions>
                         <Setter Property="Background"  Value="#00000000"/>
                         <Setter Property="BorderBrush" Value="#00000000"/>
                         <Setter Property="Foreground" Value="#FF58A6C3"/>
                     </MultiTrigger>

                 </Style.Triggers>

             </Style>
         </TreeView.ItemContainerStyle>
     </TreeView>

Обновление: благодаря предложению @Gui мне удалось глубже понять, что происходит. Существует безымянный Border, который является вытягивание свойств шаблона, который применяет стиль.

Я уже пытался удалить все свои шаблоны стилей, я понятия не имею, откуда это берется, и пока я сейчас работаю над этим, мне очень трудно обратиться к самой границе, чтобы установить другой стиль.

Обновление: на всю жизнь я не могу заставить эту рамку принять стиль, похоже, она не является частью ни одного из шаблонов управления, которые я скачал.


person user3299367    schedule 08.12.2017    source источник
comment
Я правильно понял вашу проблему? Триггер MouseOver работает правильно / как и ожидалось для вашего TreeView, но не для Expander?   -  person Yvonnila    schedule 08.12.2017
comment
Можете ли вы объяснить, чего вы хотите достичь / какого поведения вы ожидаете?   -  person Yvonnila    schedule 08.12.2017
comment
скрин не помешал бы   -  person Tim Rutter    schedule 08.12.2017
comment
Я добавил скриншот и, надеюсь, лучше обрисовал желаемое поведение   -  person user3299367    schedule 08.12.2017
comment
Я скопировал ваш XAML в новый проект и не вижу такого поведения. это должно исходить от чего-то, что вы не опубликовали. Есть ли у вас стили, определенные в app.xaml?   -  person Bradley Uffner    schedule 08.12.2017
comment
Вы проверили окно Live Property в отладке, чтобы увидеть, что применяется?   -  person Éliette    schedule 09.12.2017
comment
@Bradley Uffner: Спасибо за идею; Я удалил все шаблоны из app.xaml, я также на всякий случай просмотрел все решение и удалил пару других шаблонов; и черт возьми, поскольку я переделываю визуальный стиль всего приложения, я удалил все ссылки на фон, какие только мог. Это не оказало никакого влияния. Кода действительно намного больше; но я не могу найти ничего, что привело бы к этому.   -  person user3299367    schedule 09.12.2017
comment
@Gui: я пытался это сделать, но не могу найти способ поймать элемент в этом состоянии.   -  person user3299367    schedule 09.12.2017
comment
@Gui: Спасибо, мне удалось поймать его, а не искать способ добраться до окна, просто обновив его в состоянии.   -  person user3299367    schedule 09.12.2017
comment
@ user3299367 Отлично! ты решил свою проблему?   -  person Éliette    schedule 10.12.2017
comment
@Gui: я понимаю это лучше, но, увы, еще не решил. Моя проблема в том, что я не могу заставить шаблон коснуться его (я предполагаю, что данные генерируются шаблоном данных), я не могу решить только эту границу (все, что я пытаюсь, также обращается к границе, которая содержит контент), и хотя мои триггеры будут применять к нему другие вещи, он специально переопределяет фон и бордюр, если я попытаюсь установить его   -  person user3299367    schedule 11.12.2017


Ответы (1)


У меня это работает! Я пробовал миллион вещей, и никакие шаблоны или сеттеры не подходили. Наконец, я поместил шаблон элемента управления непосредственно в стиль элемента дерева с помощью установщика переопределения, и это сработало. У меня есть небольшая проблема с установкой цвета заливки расширителя при наведении курсора на элемент дерева, но для меня это не большая проблема.

В Ресурсах:

<SolidColorBrush x:Key="GlyphBrush" Color="#FFA1A1A1" />
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
    <Setter Property="Foreground" Value="#FFFFFF"/>
    <Setter Property="Focusable" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid Width="15" Height="13" Background="Transparent">
                    <Path x:Name="ExpandPath" HorizontalAlignment="Left"  VerticalAlignment="Center"  Margin="1,1,1,1" Fill="{StaticResource GlyphBrush}" Data="M 4 0 L 8 4 L 4 8 Z"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Data" TargetName="ExpandPath" Value="M 0 4 L 8 4 L 4 8 Z"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>
<Style x:Key="TreeViewItemFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Border>
                    <Rectangle Margin="0,0,0,0" StrokeThickness="5" Stroke="#FF717171" StrokeDashArray="1 2" Opacity="0"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Затем на странице:

   <TreeView x:Name="textureTreeView" ItemsSource="{Binding Category}"   SelectedItemChanged="textureTreeView_SelectedItemChanged" Background="#00000000" BorderBrush="{x:Null}" Foreground="#00000000" IsTextSearchEnabled="True">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local1:CategoryViewModel}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" IsHitTestVisible="False"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                                        <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                    <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                    <Setter Property="Padding" Value="1,0,0,0"/>
                    <Setter Property="Foreground" Value="#FFA1A1A1"/>
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                    <Setter Property="FontWeight" Value="Normal"/>
                    <Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type TreeViewItem}">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition MinWidth="19" Width="Auto"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition/>
                                    </Grid.RowDefinitions>
                                    <ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                    <Border Name="Bd" Grid.Column="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                                        <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                                    </Border>
                                    <ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/>
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsFocused" Value="True">
                                        <Setter Property="FontWeight" Value="Bold"/>
                                        <Setter Property="Foreground" Value="#FFFFFFFF"/>
                                    </Trigger>

                                    <Trigger Property="IsMouseOver" Value="true">
                                        <Setter Property="Border.Background"  Value="#00000000"/>
                                        <Setter Property="Background"  Value="#00000000"/>
                                        <Setter Property="BorderBrush" Value="#00000000"/>
                                        <Setter Property="Foreground" Value="#FF58A6C3"/>
                                    </Trigger>
                                    <Trigger Property="IsExpanded" Value="false">
                                        <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/>
                                    </Trigger>
                                    <Trigger Property="HasItems" Value="false">
                                        <Setter TargetName="Expander" Property="Visibility" Value="Hidden"/>
                                    </Trigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="HasHeader" Value="false"/>
                                            <Condition Property="Width" Value="Auto"/>
                                        </MultiTrigger.Conditions>
                                        <Setter TargetName="PART_Header" Property="MinWidth" Value="75"/>
                                    </MultiTrigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="HasHeader" Value="false"/>
                                            <Condition Property="Height" Value="Auto"/>
                                        </MultiTrigger.Conditions>
                                        <Setter TargetName="PART_Header" Property="MinHeight" Value="19"/>
                                    </MultiTrigger>
                                    <Trigger Property="IsSelected" Value="true">
                                        <Setter Property="FontWeight" Value="Bold"/>
                                        <Setter Property="Foreground" Value="#ffffffff"/>
                                    </Trigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="IsSelected" Value="true"/>
                                            <Condition Property="IsSelectionActive" Value="false"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                                    </MultiTrigger>
                                    <Trigger Property="IsEnabled" Value="false">
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
person user3299367    schedule 12.12.2017