WPF 找不到静态资源
WPF cannot find static resource
我在资源字典中定义了一个元素,如下所示:
<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 class 在资源字典的不同(动态加载)程序集中这一事实有关之后,我尝试在另一个控件上使用该资源并且它工作正常......专门用于使用该工具栏样式。
<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>
有谁知道为什么在运行时会针对此特定用途发生这种情况?它是动态创建的事实与它有什么关系吗?
提前致谢,
斯科特
我猜测它不起作用的原因是 WPF 如何以及何时查找和绑定静态资源的一些怪癖。我的猜测是它更多地与你如何加载程序集而不是你如何实例化对象(通过 Activator.CreateInstance
的反射)有关,但我可能完全不了解,更熟悉 WPF 内部结构的人必须肯定地说.
但是,解决方法应该很简单:改为使用 DynamicResource
。 DynamicResource
更像普通绑定,解析引用应该没有问题。
我已经点击 link 很多次了,但还是不行。每次答案都是我在键名后添加一个 space,如下所示:x:Key="Name "
我经常想念这个,而且我似乎也从未学过。
我在资源字典中定义了一个元素,如下所示:
<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 class 在资源字典的不同(动态加载)程序集中这一事实有关之后,我尝试在另一个控件上使用该资源并且它工作正常......专门用于使用该工具栏样式。
<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>
有谁知道为什么在运行时会针对此特定用途发生这种情况?它是动态创建的事实与它有什么关系吗?
提前致谢, 斯科特
我猜测它不起作用的原因是 WPF 如何以及何时查找和绑定静态资源的一些怪癖。我的猜测是它更多地与你如何加载程序集而不是你如何实例化对象(通过 Activator.CreateInstance
的反射)有关,但我可能完全不了解,更熟悉 WPF 内部结构的人必须肯定地说.
但是,解决方法应该很简单:改为使用 DynamicResource
。 DynamicResource
更像普通绑定,解析引用应该没有问题。
我已经点击 link 很多次了,但还是不行。每次答案都是我在键名后添加一个 space,如下所示:x:Key="Name " 我经常想念这个,而且我似乎也从未学过。