我在资源字典中定义了一个元素,如下所示:
<SolidColorBrush x:Key="ChromeBrush" Color="Red" />
我尝试将其用作Border
的背景,如下所示:
<Style TargetType="ToolBar">
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToolBar">
<Border x:Name="Border" Background="{StaticResource ChromeBrush}">
<DockPanel>
<ToolBarPanel x:Name="PART_ToolBarPanel" IsItemsHost="true" Margin="0,1,2,2" />
</DockPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
对于此特定用法,我收到错误Cannot find resource named 'ChromeBrush'. Resource names are case sensitive
。
如果我将静态资源使用情况更改为Red
,则所有工作都按预期工作。
托管工具栏的用户控件正在运行时动态创建(通过Activator.CreateInstance(...)
) - 如果有帮助,用户控件的XAML为:
<framework:PanelBase x:Class="Framework.UserControl1"
namespaces omitted for brevity
>
<framework:PanelBase.ToolbarTemplate>
<ToolBar />
</framework:PanelBase.ToolbarTemplate>
<!-- other controls -->
</framework:PanelBase>
奇怪的是,画笔在项目的其他地方多次用于各种控件,完全相同但没有问题(一些用法实际上在托管用户控件上)。在上面的代码段中,Visual Studio以正确的颜色强调资源,因此它能够解析它。
更新 在想知道它是否与UserControl1类在资源字典中的不同(动态加载)程序集中的事实有关时,我尝试在另一个控件上使用该资源并且它工作正常...具体到某些东西使用该工具栏样式。
<framework:PanelBase x:Class="Framework.UserControl1"
namespaces omitted for brevity
>
<framework:PanelBase.ToolbarTemplate>
<ToolBar />
</framework:PanelBase.ToolbarTemplate>
<Border Background="{StaticResource ChromeBrush}">
<!-- WORKS FINE! -->
</Border>
</framework:PanelBase>
有没有人知道为什么在运行时可能会出现这种特定用法?它动态创建的事实是否与它有关?
提前致谢, 斯科特
答案 0 :(得分:0)
我猜测它不起作用的原因是WPF如何以及何时查找和绑定静态资源的一些怪癖。我的猜测是,你加载程序集的方式比你实例化对象的方式更多(通过Activator.CreateInstance
的反射),但我可能完全关闭,更熟悉WPF内部的人必须肯定地说
但是,解决方法应该很简单:改用DynamicResource
。 DynamicResource
更像普通绑定,并且在解析引用时应该没有问题。
答案 1 :(得分:0)
当这不起作用时,我已经多次单击链接。每次答案都是我在键名后添加一个空格,如下所示: x:Key="Name " 我经常怀念这个,而且我似乎也从来没有学过。