将窗口主题更改为高对比度时,将按钮颜色更改为白色

时间:2014-03-13 11:58:17

标签: 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>

2 个答案:

答案 0 :(得分:3)

您需要在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.if标签属性中存储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>

答案 1 :(得分: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));
        }
    }
}