ResourceDictionary Style.Triggers 在用户控件中不工作
ResourceDictionary Style.Triggers Not Working In UserControl
我在自己的 XAML 文件中的 UserControl
中有以下 Grid
:
<Grid Style="{StaticResource GridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="70"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="Box1" Style="{StaticResource ContainedTextBlock}" Grid.Column="0"/>
<TextBlock x:Name="Box2" Style="{StaticResource ContainedTextBlock}" Grid.Column="2"/>
<TextBlock x:Name="Box3" Style="{StaticResource ContainedTextBlock}" Grid.Column="4" TextAlignment="Right"/>
</Grid>
在单独的资源字典 XAML 文件中,我有以下内容:
<SolidColorBrush x:Key="PrimaryColour" Color="#FF334D51"/>
<SolidColorBrush x:Key="BackgroundGray" Color="#FFDEDEDE"/>
<SolidColorBrush x:Key="SelectedGray" Color="#FF566164"/>
<Style TargetType="TextBlock" x:Key="ContainedTextBlock">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource PrimaryColour}"/>
<Setter Property="TextTrimming" Value="WordEllipsis"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style TargetType="Grid" x:Key="GridStyle">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="{StaticResource BackgroundGray}"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Background" Value="{StaticResource SelectedGray}"/>
</Trigger>
</Style.Triggers>
</Style>
谁能帮我解释一下为什么 Style.Triggers 部分在运行时没有被拾取,即我的控件的颜色没有改变? (注意:样式的其他部分有效。)
Grid
对象无法获得焦点(TextBlock
也无法获得焦点,尽管这在上面发布的代码中并不直接相关)。那么按理说,任何只有在获得焦点时才被激活的触发器本身永远不会被激活。
如果您不这么认为,请提供 a good, minimal, complete code example 可靠地重现该问题。请务必准确说明用户应如何与程序交互,以便您希望这些触发器被激活。
我终于搞定了。
对于用户控件:
<UserControl x:Class="Project.Controls.CustomGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto" Style="{StaticResource GridStyle}">
<Grid Style="{StaticResource ContainedGrid}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="70"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="Block1" Grid.Column="0" Style="{StaticResource ContainedTextBlock}"/>
<TextBlock x:Name="Block2" Grid.Column="2" Style="{StaticResource ContainedTextBlock}"/>
<TextBlock x:Name="Block3" Grid.Column="4" TextAlignment="Right" Style="{StaticResource ContainedTextBlock}"/>
</Grid>
</UserControl>
在资源词典中:
<Style TargetType="UserControl" x:Key="GridStyle">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Focusable" Value="True"/>
</Style>
<Style TargetType="{x:Type Grid}" x:Key="ContainedGrid">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="True">
<Setter Property="Background" Value="{StaticResource BackgroundGray}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsKeyboardFocused, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="True">
<Setter Property="Background" Value="{StaticResource SelectedGray}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TextBlock}" x:Key="ContainedTextBlock">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource PrimaryColor}"/>
<Setter Property="TextTrimming" Value="WordEllipsis"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsKeyboardFocused, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" Value="True">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
另一件要注意的事情,也是让我失望的最后一件事,是我用来为用户控件提供键盘焦点的事件处理程序没有……
e.Handled = true;
……最后。
点击因此冒泡并为容器(ScrollViewer)提供键盘焦点。
总结一下:
- 获得焦点的元素是 UserControl。
- Grid 和 TextBlock 正在根据其祖先中最近的 UserControl 的焦点状态进行格式化。
我在自己的 XAML 文件中的 UserControl
中有以下 Grid
:
<Grid Style="{StaticResource GridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="70"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="Box1" Style="{StaticResource ContainedTextBlock}" Grid.Column="0"/>
<TextBlock x:Name="Box2" Style="{StaticResource ContainedTextBlock}" Grid.Column="2"/>
<TextBlock x:Name="Box3" Style="{StaticResource ContainedTextBlock}" Grid.Column="4" TextAlignment="Right"/>
</Grid>
在单独的资源字典 XAML 文件中,我有以下内容:
<SolidColorBrush x:Key="PrimaryColour" Color="#FF334D51"/>
<SolidColorBrush x:Key="BackgroundGray" Color="#FFDEDEDE"/>
<SolidColorBrush x:Key="SelectedGray" Color="#FF566164"/>
<Style TargetType="TextBlock" x:Key="ContainedTextBlock">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource PrimaryColour}"/>
<Setter Property="TextTrimming" Value="WordEllipsis"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style TargetType="Grid" x:Key="GridStyle">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="{StaticResource BackgroundGray}"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Background" Value="{StaticResource SelectedGray}"/>
</Trigger>
</Style.Triggers>
</Style>
谁能帮我解释一下为什么 Style.Triggers 部分在运行时没有被拾取,即我的控件的颜色没有改变? (注意:样式的其他部分有效。)
Grid
对象无法获得焦点(TextBlock
也无法获得焦点,尽管这在上面发布的代码中并不直接相关)。那么按理说,任何只有在获得焦点时才被激活的触发器本身永远不会被激活。
如果您不这么认为,请提供 a good, minimal, complete code example 可靠地重现该问题。请务必准确说明用户应如何与程序交互,以便您希望这些触发器被激活。
我终于搞定了。
对于用户控件:
<UserControl x:Class="Project.Controls.CustomGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto" Style="{StaticResource GridStyle}">
<Grid Style="{StaticResource ContainedGrid}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="70"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="Block1" Grid.Column="0" Style="{StaticResource ContainedTextBlock}"/>
<TextBlock x:Name="Block2" Grid.Column="2" Style="{StaticResource ContainedTextBlock}"/>
<TextBlock x:Name="Block3" Grid.Column="4" TextAlignment="Right" Style="{StaticResource ContainedTextBlock}"/>
</Grid>
</UserControl>
在资源词典中:
<Style TargetType="UserControl" x:Key="GridStyle">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Focusable" Value="True"/>
</Style>
<Style TargetType="{x:Type Grid}" x:Key="ContainedGrid">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="True">
<Setter Property="Background" Value="{StaticResource BackgroundGray}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsKeyboardFocused, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="True">
<Setter Property="Background" Value="{StaticResource SelectedGray}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TextBlock}" x:Key="ContainedTextBlock">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource PrimaryColor}"/>
<Setter Property="TextTrimming" Value="WordEllipsis"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsKeyboardFocused, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" Value="True">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
另一件要注意的事情,也是让我失望的最后一件事,是我用来为用户控件提供键盘焦点的事件处理程序没有……
e.Handled = true;
……最后。
点击因此冒泡并为容器(ScrollViewer)提供键盘焦点。
总结一下:
- 获得焦点的元素是 UserControl。
- Grid 和 TextBlock 正在根据其祖先中最近的 UserControl 的焦点状态进行格式化。