【问题标题】:Change button color to white when changing windows theme to high contrast将 Windows 主题更改为高对比度时将按钮颜色更改为白色
【发布时间】:2014-03-13 11:58:16
【问题描述】:

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

<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>

【问题讨论】:

  • 您是否在已设置高对比度模式时启动了应用程序?那么Background 按钮会显示什么?
  • @Herdo- 我更改了主题,然后运行应用程序并没有任何反应,默认按钮颜色为黑色,在高对比度模式下我想将其更改为白色...
  • 您的应用程序的图形设计是否不允许使用系统颜色?

标签: c# wpf xaml mvvm


【解决方案1】:

你需要在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 主题值。如果标签属性具有该值,则只有主题更改为 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>

【讨论】:

  • HI Henna,谢谢投票,问题是我不能使用它,因为我有很多按钮,而且这个按钮继承自我提供的样式......有一种方法可以改变它并且按钮将具有他的特定颜色红色黑色等,当您将主题更改为高对比度时,将按钮更改为白色。
  • 谢谢 Heena,有一种方法可以使样式有条件,即仅当您不处于高对比度模式时,该样式才适用于按钮?
  • 可以使用样式选择器stackoverflow.com/questions/5082509/…
  • +1:很酷的答案。我不知道高对比度模式在SystemParameters.HighContrastKey
【解决方案2】:

WPF 不附加到 SystemParameters.StaticPropertyChanged 事件。因此,您需要声明一个附加到此事件的包装器,并使用PropertyChanged 事件将其传递给视图。一个简单的实现可能如下所示:

View.xaml:

<Window xmlns:app="clr-namespace:YourNamespace">
    <Window.Resources>
        <Style x:Key="HighContrastButtonStyle"
               TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Source={x:Static app:UserPrefParameters.Instance}, Path=HighContrast}"
                             Value="true">
                    <Setter Property="Background" Value="White"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Button Style="{StaticResource HighContrastButtonStyle}"
            Content="Press me!"/>
</Window>

UserPrefParameters.cs:

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;

namespace YourNamespace
{
    public class UserPrefParameters : INotifyPropertyChanged
    {
        public static readonly UserPrefParameters Instance;

        public bool HighContrast
        {
            get { return SystemParameters.HighContrast; }
        }

        static UserPrefParameters()
        {
            Instance = new UserPrefParameters();
        }

        public UserPrefParameters()
        {
            SystemParameters.StaticPropertyChanged += SystemParametersOnStaticPropertyChanged;
        }

        private void SystemParametersOnStaticPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            if (args.PropertyName == "HighContrast")
                OnPropertyChanged(args.PropertyName);
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

【讨论】:

  • HI Herdo。有一种方法是样式是有条件的,即仅当您不在高对比度模式下时该样式才适用于按钮?
  • @JeanTehhe 样式适用于所有按钮。但仅当 HighContrast 值为 true 时,颜色才适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多