更改了TextBox样式中的SolidColorBrush



我已经试过询问,但可能没有提供足够的信息。我正在尝试创建我自己的WPF主题。一切都还可以,直到我创造了这种风格。

<Style TargetType="{x:Type TextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Disabled">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PART_ContentHost">
<EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
<EasingColorKeyFrame KeyTime="0" Value="Red"/>
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
<EasingColorKeyFrame KeyTime="0" Value="Yellow"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="ReadOnly"/>
<VisualState x:Name="MouseOver"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="Background" Fill="{StaticResource OniiControlBackgroundBrush}" Stroke="{StaticResource OniiNormalBrush}" RadiusX="2" RadiusY="2"/>
<ScrollViewer x:Name="PART_ContentHost" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" FontFamily="{TemplateBinding FontFamily}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
</Style>

当TextBox被禁用时,它应该更改TextBox背景和BorderBrush的颜色。

颜色在同一ResourceDictionary 中定义

<Color x:Key="MainColor">#FF595959</Color>
<Color x:Key="OniiControlBackgroundColor">#FF333333</Color>
<SolidColorBrush x:Key="OniiNormalBrush" Color="{StaticResource MainColor}"/>
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="{StaticResource OniiControlBackgroundColor}" />

我不知道我真正的问题是什么。我所知道的:

1/"当TextBox被禁用时,它会将使用OniiControlBackgroundBrush的所有东西的颜色更改为红色">

  • OniiControlBackgroundBrush在其他样式中被引用为StaticResource

2/"当我切换这些颜色时,仍然只有OniiControlBackgroundBrush被更改,但这次是黄色">

<Rectangle x:Name="Background" Fill="{StaticResource OniiNormalBrush}" Stroke="{StaticResource OniiControlBackgroundBrush}" RadiusX="2" RadiusY="2"/>
  • OniiNormalBrush在其他样式中也被引用为StaticResource

3/"所有内容都定义在一个资源字典中">

<Application.Resources>
<ResourceDictionary Source="Theme/OniiResourceDictionary.xaml">
</ResourceDictionary>
</Application.Resources>

4/"我试图用较少的自定义样式在较小的解决方案中重现这个问题,但我没有成功">

  • 我使用了相同的TextBox样式。

    <TextBox Height="32" HorizontalAlignment="Left" Margin="38,51,0,0" Name="textBox1" VerticalAlignment="Top" Width="215" />
    <CheckBox Content="Enabled" Height="16" HorizontalAlignment="Left" Margin="259,51,0,0" Name="checkBox1" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" />
    <Border Height="148" HorizontalAlignment="Left" Margin="254,126,0,0" Name="border1" VerticalAlignment="Top" Width="98" />
    <Rectangle Fill="{StaticResource OniiNormalBrush}" StrokeThickness="20" Stroke="{StaticResource OniiControlBackgroundBrush}" Height="148" HorizontalAlignment="Left" Margin="358,126,0,0" Name="rectangle5" VerticalAlignment="Top" Width="99" />
    
  • 复选框禁用和启用文本框,边框使用两种颜色的自定义样式作为StaticResources

5/"当我将以下代码添加到我的原始解决方案时,问题消失了">

<Rectangle Height="71" HorizontalAlignment="Left" Margin="130,131,0,0" Name="rectangle2" StrokeThickness="20" Stroke="{StaticResource OniiControlBackgroundBrush}" Fill="{StaticResource OniiNormalBrush}" VerticalAlignment="Top" Width="98" />

我真的错过了什么吗?还是我真的很愚蠢?不管怎样,非常感谢您的帮助。我真的很失落。最后,我不想使用x:Shared="false",主要是因为我认为更改OniiNormalBrush没有问题。非常感谢。

问题似乎在于资源绑定。当您使用StaticResource时,这意味着该资源在窗口初始化时加载,然后再也不会加载。因此,在大多数情况下,当您修改资源时,绑定到它的控件不知道更改。

在#4中,您没有遇到问题,因为您使用了DynamicResource,它允许在运行时更新资源。

编辑:第二次看东西时,它看起来可能是两件事中的一件。

一。。颜色的静态绑定不允许更新。将"颜色"绑定到笔刷时,将"静态"更改为"动态"是否解决了问题?

<Color x:Key="MainColor">#FF595959</Color>
<Color x:Key="OniiControlBackgroundColor">#FF333333</Color>
<SolidColorBrush x:Key="OniiNormalBrush" Color="{DynamicResource MainColor}"/>
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="{DynamicResource OniiControlBackgroundColor}" />

两个。。。动画正在设置笔刷上的颜色。。这本质上是通过为其指定直接颜色来清除绑定。我本以为当动画结束时,颜色会被设置回绑定,但事实可能并非如此。这有任何影响吗:

<SolidColorBrush x:Key="OniiNormalBrush" Color="#FF595959"/>
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="#FF333333" />

最新更新