在 WPF 中应用条件样式
Apply conditional styling in WPF
我 运行 通过一个问题,需要在菜单项上应用条件样式,这是我的代码片段中的一点:
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,10,0,0">
<Menu HorizontalAlignment="Left" KeyboardNavigation.TabNavigation="Once" Background="Transparent" d:LayoutOverrides="Height">
<MenuItem Header="Menu1" Style="{DynamicResource M_Left}" />
<MenuItem Header="Menu2" Style="{DynamicResource M_Middle}" />
<MenuItem Header="Menu3" Style="{DynamicResource M_Right}" Visibility="{Binding IsEligibleToDisplay, Converter={StaticResource MyVisibilityConverter}}" />
</Menu>
</Grid>
在上面,IsEligibleToDisplay a bool 属性 和 MyVisibilityConverter 根据 True 或 false 将 Visibility 设置为 Visible 或 Hidden。
期待什么?
如果 "Menu3" 的可见性是隐藏的,即 IsEligibleToDisplay = false,那么 "Menu2" 的样式应该是 Style="{DynamicResource M_Right}" 否则 Style="{DynamicResource M_Middle}"
类似于(这只是假设,请不要检查语法 - 它是错误的:)):
<MenuItem Header="Menu2" Style="IsEligibleToDisplay ? {DynamicResource M_Middle} : {DynamicResource M_Right}" />
非常感谢任何帮助!
您可能要考虑的一种方法是使用 ItemContainerStyleSelector 属性.
在 Menu 控件上使用样式选择器
ItemContainerStyleSelector Property
这将允许您创建自定义逻辑来为您的个人菜单项设置所需的样式。
如果你的要求是只使用XAML,我想你可以使用DataTriggers。
您不能直接在 Style
属性 中设置 "condition",但您必须将其移动到 Style
声明中。
也许这个小示例可以帮助您解决您的任务:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="400">
<Window.Resources>
<Style x:Key="ConditionalStyle" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=Menu3, Path=Visibility}" Value="Visible">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=Menu3, Path=Visibility}" Value="Hidden">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<Menu HorizontalAlignment="Left" KeyboardNavigation.TabNavigation="Once" Background="Transparent">
<MenuItem Header="Menu1" />
<MenuItem Header="Menu2" Style="{DynamicResource ConditionalStyle}" />
<MenuItem Name="Menu3" Header="Menu3" Visibility="Visible" />
</Menu>
<Button Content="ClickMe" Margin="10" Click="Button_Click" />
</StackPanel>
</Window>
我使用按钮只是将 Menu3 从可见切换到隐藏,反之亦然。我使用了一个简单的处理程序:
private void Button_Click(object sender, RoutedEventArgs e)
{
if(Menu3.Visibility == System.Windows.Visibility.Visible)
{
Menu3.Visibility = System.Windows.Visibility.Hidden;
return;
}
Menu3.Visibility = System.Windows.Visibility.Visible;
}
希望这个解决方案适合你。
也许您可以尝试使用基于 IsEligibleToDisplay 属性 的数据触发器并使用通用模板。
将此示例放入 ResourceDictionary 中:
<!-- The visibility converter -->
<BooleanToVisibilityConverter x:Key="MyVisibilityConverter" />
<!-- Common template -->
<ControlTemplate x:Key="myContent">
<Label Content="{Binding Header, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Center"
HorizontalContentAlignment="Center"
Padding="0"
Height="20"
Width="80"
Background="Green"/>
</ControlTemplate>
<!-- M_Left style -->
<Style x:Key="M_Left"
TargetType="MenuItem">
<Setter Property="Background"
Value="Yellow" />
</Style>
<Style x:Key="M_Middle"
TargetType="MenuItem">
<Setter Property="Background"
Value="Red" />
<Style.Triggers>
<!-- trigger based on IsEligibleToDisplay property -->
<DataTrigger Binding="{Binding IsEligibleToDisplay}"
Value="false">
<!-- If false then apply common template to middle menu item. -->
<Setter Property="Template"
Value="{DynamicResource myContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="M_Right"
TargetType="MenuItem">
<Setter Property="Template"
Value="{DynamicResource myContent}" />
</Style>
我 运行 通过一个问题,需要在菜单项上应用条件样式,这是我的代码片段中的一点:
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,10,0,0">
<Menu HorizontalAlignment="Left" KeyboardNavigation.TabNavigation="Once" Background="Transparent" d:LayoutOverrides="Height">
<MenuItem Header="Menu1" Style="{DynamicResource M_Left}" />
<MenuItem Header="Menu2" Style="{DynamicResource M_Middle}" />
<MenuItem Header="Menu3" Style="{DynamicResource M_Right}" Visibility="{Binding IsEligibleToDisplay, Converter={StaticResource MyVisibilityConverter}}" />
</Menu>
</Grid>
在上面,IsEligibleToDisplay a bool 属性 和 MyVisibilityConverter 根据 True 或 false 将 Visibility 设置为 Visible 或 Hidden。
期待什么?
如果 "Menu3" 的可见性是隐藏的,即 IsEligibleToDisplay = false,那么 "Menu2" 的样式应该是 Style="{DynamicResource M_Right}" 否则 Style="{DynamicResource M_Middle}"
类似于(这只是假设,请不要检查语法 - 它是错误的:)):
<MenuItem Header="Menu2" Style="IsEligibleToDisplay ? {DynamicResource M_Middle} : {DynamicResource M_Right}" />
非常感谢任何帮助!
您可能要考虑的一种方法是使用 ItemContainerStyleSelector 属性.
在 Menu 控件上使用样式选择器ItemContainerStyleSelector Property
这将允许您创建自定义逻辑来为您的个人菜单项设置所需的样式。
如果你的要求是只使用XAML,我想你可以使用DataTriggers。
您不能直接在 Style
属性 中设置 "condition",但您必须将其移动到 Style
声明中。
也许这个小示例可以帮助您解决您的任务:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="400">
<Window.Resources>
<Style x:Key="ConditionalStyle" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=Menu3, Path=Visibility}" Value="Visible">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=Menu3, Path=Visibility}" Value="Hidden">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<Menu HorizontalAlignment="Left" KeyboardNavigation.TabNavigation="Once" Background="Transparent">
<MenuItem Header="Menu1" />
<MenuItem Header="Menu2" Style="{DynamicResource ConditionalStyle}" />
<MenuItem Name="Menu3" Header="Menu3" Visibility="Visible" />
</Menu>
<Button Content="ClickMe" Margin="10" Click="Button_Click" />
</StackPanel>
</Window>
我使用按钮只是将 Menu3 从可见切换到隐藏,反之亦然。我使用了一个简单的处理程序:
private void Button_Click(object sender, RoutedEventArgs e)
{
if(Menu3.Visibility == System.Windows.Visibility.Visible)
{
Menu3.Visibility = System.Windows.Visibility.Hidden;
return;
}
Menu3.Visibility = System.Windows.Visibility.Visible;
}
希望这个解决方案适合你。
也许您可以尝试使用基于 IsEligibleToDisplay 属性 的数据触发器并使用通用模板。
将此示例放入 ResourceDictionary 中:
<!-- The visibility converter -->
<BooleanToVisibilityConverter x:Key="MyVisibilityConverter" />
<!-- Common template -->
<ControlTemplate x:Key="myContent">
<Label Content="{Binding Header, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Center"
HorizontalContentAlignment="Center"
Padding="0"
Height="20"
Width="80"
Background="Green"/>
</ControlTemplate>
<!-- M_Left style -->
<Style x:Key="M_Left"
TargetType="MenuItem">
<Setter Property="Background"
Value="Yellow" />
</Style>
<Style x:Key="M_Middle"
TargetType="MenuItem">
<Setter Property="Background"
Value="Red" />
<Style.Triggers>
<!-- trigger based on IsEligibleToDisplay property -->
<DataTrigger Binding="{Binding IsEligibleToDisplay}"
Value="false">
<!-- If false then apply common template to middle menu item. -->
<Setter Property="Template"
Value="{DynamicResource myContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="M_Right"
TargetType="MenuItem">
<Setter Property="Template"
Value="{DynamicResource myContent}" />
</Style>