我使用以下代码,当我将对比度更改为高时,没有任何反应(按钮保留为原始颜色) 我想念的是什么?我只想在高对比度模式下将按钮颜色更改为白色
<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>
答案 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));
}
}
}