2010-01-24 127 views
1

我修改WPF Calendar控件的控件模板来改变文字的颜色和控制的上一页下一页箭头。我想将颜色设置为名为MyTextBrush的本地SolidColorBrush资源。WPF:将指定的颜色设置为资源?

的上一页和下一页按钮具有单独的控制模板,并且每个吸取用于其按钮的箭头a Path对象。下面是上一页按钮相关的标记:

<Path Margin="14,-6,0,0" Height="10" Width="6" VerticalAlignment="Center" HorizontalAlignment="Left" Stretch="Fill" Data="M288.75,232.25 L288.75,240.625 L283,236.625 z"> 
    <Path.Fill> 
     <SolidColorBrush x:Name="TextColor" Color="#FF333333" /> 
    </Path.Fill> 
</Path> 

注意颜色命名TextColor,使用x:Name财产。

这里是我的问题:需要x:Name属性 - 如果它缺少WPF抛出异常。这意味着我不能简单地给MyTextBrush资源的引用更换整个刷,因为我将失去x:Name值。所以,我怎么引用MyTextBrush,同时仍保留了x:Name属性为刷在这个特殊的控制模板?

感谢您的帮助。

+0

为什么WPF在刷子上需要一个x:Name?名称通常不是必需的:您是从触发器或动画还是代码隐藏引用它?如果可以的话,你能说出什么是什么以及你想用刷子做什么? – itowlson 2010-01-24 23:02:24

+0

它确实让我感到吃惊。 WPF日历控件(WPF工具包,2009年6月)有点破解。日历文本颜色是硬编码在三个不同的控制模板中,通常在控制模板中完成的一些事情是在代码中完成的,等等。随着代码的味道,它真的很臭。 – 2010-01-25 00:15:25

+0

我认为他们这样做的原因是你不能在资源字典中轻松地制作某些东西,因此他们不得不烘焙“TextColor” – Schneider 2010-01-25 02:48:02

回答

1

所以,我怎么引用MyTextBrush, 同时仍保留了X:名称 属性为刷这个 特别是控制模板?

关于这个问题,听起来像你使用了一个狡猾的/脆弱的模板。它是什么控制模板?

  • 如果您完全控制了模板的源代码管理,请删除对指定元素的引用(最有可能在故事板中)。他们必须为某种原因制作动画。
  • 另一种选择可能是刚刚创建的模板中的未使用的刷(也许在隐藏的元素)使用正确的名称,以保持模板快乐。
  • 最后,您可以尝试添加x:Name onto the brush in the shared RD,但是这是一个相当复杂,不知道它的价值吧!

另外两个可能的解决方案:

  • 尝试结合只是SCB的颜色属性...应作为其工作的一个DP
  • 更改模板动画,使他们不使用命名刷,而是使用一个命名的父母,然后通过TargetProperty访问画笔,例如Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="myNamedParent"
+0

Dodgy并没有开始描述它。这是WPF日历控件的控件模板,它是一个混乱。它需要进行大手术才能将日历文本颜色绑定到控件的Foreground属性。 – 2010-01-25 00:55:26

+0

您是否希望保留日历文字颜色动画?如果不是简单地撕开故事板 – Schneider 2010-01-25 02:44:28

0

最好的解决办法似乎是打破Color地产出它自己的代码,并使用该资源引用。下面是它的样子:

<!-- FS: Changed template brush color --> 
<SolidColorBrush x:Name="TextColor"> 
    <SolidColorBrush.Color> 
     <StaticResource ResourceKey="FsTextColor" /> 
    </SolidColorBrush.Color> 
</SolidColorBrush> 
相关问题