c# - 在 WPF 中应用条件样式

标签 c# wpf xaml styles

我遇到了一个问题,需要在菜单项上应用条件样式,以下是我的代码片段中的一些内容:

<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 是一个 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}" />  

任何帮助将不胜感激!

最佳答案

如果您的要求只是使用 XAML,我想您可以使用 DataTriggers .

您无法直接在 Style 属性中设置“条件”,但必须将其移至 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;
}

我希望这个解决方案适合您。

关于c# - 在 WPF 中应用条件样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32383501/

相关文章:

c# - 在 XAML 中使用单例 - 可能吗?

c# - Xamarin 4 中旧的 ListView 和新的 CollectionView 有什么区别?

wpf - 有没有办法知道 WPF 应用程序是否正在关闭?

c# - wpf 表单不显示图像

c# - 使用 iText 7 for .NET 时如何定义 Colspan 和 Rowspan

c# - 如何在 ListBox 中将第一项加粗?

XAML 绑定(bind)到 Collection[index].ObjectProperty

C# 和 .NET 的关系

c# - 当用户超过每日传输限制时,正确的 HTTP 状态代码是什么?

c# - Entity Framework - LINQ 的 SQL 命令