正确使用backgroundcolor资源用于多个组件

时间:2015-07-02 09:11:58

标签: wpf xaml background-color controltemplate

我创建了一个资源文件,我想在其中保存我的应用程序的所有颜色,以便我可以稍后更改它们,如果我的老板决定他想要的颜色。

我的问题在于这种方法的组合是对我的ComboboxToggleButton使用controltemplate。确切地说:如果我将鼠标悬停在组合框上,它应该改变它的背景部分,即GradientBrush。 当前代码(在ComboBoxToggleButton的VisualstateManager中)如下所示:

<VisualState x:Name="MouseOver">
   <Storyboard>
        <ColorAnimationUsingKeyFrames
           Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
           Storyboard.TargetName="Border">
            <EasingColorKeyFrame KeyTime="0" Value="{StaticResource Highlighted_Color}" />
        </ColorAnimationUsingKeyFrames>
   </Storyboard>
</VisualState>

问题是此解决方案会更改使用相同GradientBrush作为背景的所有控件的颜色,而不仅仅是鼠标悬停在控件上的控件的颜色。

我怎样才能最轻松地解决这个问题?

我尝试用Combobox中的触发器替换ToggleButton的Visual States部分,但它们没有效果。
在最糟糕的情况下,我可以回到GradientBrush在每个Control中直接嵌入的版本,所以不是来自我的ColorsAndBrushes文件的资源,但如果我想稍后更改颜色,那将会相当难看。

1 个答案:

答案 0 :(得分:1)

当您定义类似GradientBrush的内容时,WPF会提供该对象的一个​​实例,该实例由引用它的所有UI控件共享。实际上它是一个&#34; singleton&#34;,所以当动画应用于GradientBrush时,你会同时在所有其他控件中看到效果。

尝试将x:Shared="False"添加到GradientBrush。这将确保使用GradientBrush资源的每个控件都获得自己的实例。