c# - 将 Windows 主题更改为高对比度时,将按钮颜色更改为白色

标签 c# wpf xaml mvvm

我使用以下代码,当我将对比度更改为高时,没有任何反应(按钮保持原始颜色), 我在这里想念什么?我只想在高对比度模式下将按钮颜色更改为白色

<Style x:Key="ButtonStyle"
           TargetType="Button">
        <Setter Property="Template"
                Value="{StaticResource ButtonBaseControlTemplate}" />
        <Setter Property="FocusVisualStyle">
            <Setter.Value>
                <Style>
                </Style>
            </Setter.Value>
        </Setter>

        <Style.Triggers>
            <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}"
                         Value="True">
                <Setter Property="Background"
                        Value="White"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

最佳答案

你需要在controltemplate里面添加datatrigger

 <Button Height="35" Width="100" Content="Hello World">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Template" Value="{DynamicResource ButtonBaseControlTemplate1}"/>
            </Style>
        </Button.Style>
        <Button.Resources>
            <ControlTemplate x:Key="ButtonBaseControlTemplate1" TargetType="{x:Type ButtonBase}">
                <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>                       
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF3C7FB1"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" TargetName="border" Value="#FFC4E5F6"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF2C628B"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Background" TargetName="border" Value="#FFF4F4F4"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="#FFADB2B5"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383"/>
                    </Trigger>
                    <DataTrigger Binding="{Binding Source={x:Static SystemParameters.HighContrast}}" Value="True">
                        <Setter Property="Background" Value="White"/>
                        <Setter Property="Foreground" Value="Black"/>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Resources>

    </Button>

更新

我在 Tag 中存储了 HighContrast Theme 值。如果标记属性具有该值,则只有主题被更改为 HighContrast,否则不会。

     <Window.Resources>
        <!--Button ControlTemplate-->
        <ControlTemplate x:Key="ButtonBaseControlTemplate" TargetType="{x:Type ButtonBase}">
            <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/>
                    <Setter Property="BorderBrush" TargetName="border" Value="#FF3C7FB1"/>
                </Trigger>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="Background" TargetName="border" Value="#FFC4E5F6"/>
                    <Setter Property="BorderBrush" TargetName="border" Value="#FF2C628B"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Background" TargetName="border" Value="#FFF4F4F4"/>
                    <Setter Property="BorderBrush" TargetName="border" Value="#FFADB2B5"/>
                    <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383"/>
                </Trigger>
                <DataTrigger Binding="{Binding RelativeSource= {x:Static RelativeSource.Self}, Path=Tag}" Value="True">
                    <Setter Property="Background" Value="White"/>
                    <Setter Property="Foreground" Value="Black"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding RelativeSource= {x:Static RelativeSource.Self}, Path=Tag}" Value="False">
                    <Setter Property="Background" Value="Gray"/>
                </DataTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

        <!--Button Style-->
        <Style x:Key="buttonstyle" TargetType="Button">
            <Setter Property="Template" Value="{StaticResource ButtonBaseControlTemplate}"/>
        </Style>

    </Window.Resources>

    <Grid>
        <Button HorizontalAlignment="Left" Height="35" Style="{StaticResource buttonstyle}" Width="100" Tag="{DynamicResource {x:Static SystemParameters.HighContrastKey}}" Content="Hello World"/>
        <Button HorizontalAlignment="Right" Height="35" Width="100" Style="{StaticResource buttonstyle}" Content="ok"></Button>
    </Grid>

关于c# - 将 Windows 主题更改为高对比度时,将按钮颜色更改为白色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22377928/

相关文章:

c# - 使用 C# 检查用户是否已存在于 MySql 数据库中

c# - 如何获取 "visible"大小的 Canvas ?

wpf 删除数据网格左填充

c# - WPF 功能区上的右对齐(帮助)按钮

c# - 在 C# 控件中使用 Unicode 字符

c# - 在 C# 中如何查找内部设备的 mac 地址而不是路由器 mac 地址

c# - 开源C#机会

c# - GC 会停止 .NET 中的所有应用程序线程吗?

c# - 如何使用 WPF 的 UI 自动化将右键单击事件发送到 AutomationElement?

c# - 在 C# 中以编程方式调整 wpf 窗口的大小