在TextBox样式中更改了SolidColorBrush

时间:2012-11-12 13:34:34

标签: wpf xaml styles brush

我已经尝试过询问,但可能我没有提供足够的信息。我正在尝试创建自己的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 Background和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" />
    
  • 文本框已禁用并由CheckBox启用,边框使用两种颜色的自定义样式作为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没有问题。谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

编辑:在第二次查看事物时,它看起来可能是两件事之一。

一个..颜色的静态绑定不允许更新。将Color粘贴到画笔时,从静态变为动态是否可以解决问题?

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