我创建了一个资源文件,我想在其中保存我的应用程序的所有颜色,以便我可以稍后更改它们,如果我的老板决定他想要的颜色。
我的问题在于这种方法的组合是对我的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文件的资源,但如果我想稍后更改颜色,那将会相当难看。
答案 0 :(得分:1)
当您定义类似GradientBrush的内容时,WPF会提供该对象的一个实例,该实例由引用它的所有UI控件共享。实际上它是一个&#34; singleton&#34;,所以当动画应用于GradientBrush时,你会同时在所有其他控件中看到效果。
尝试将x:Shared="False"
添加到GradientBrush。这将确保使用GradientBrush资源的每个控件都获得自己的实例。