WPF无法找到静态资源

时间:2018-02-02 19:45:03

标签: c# wpf wpf-controls

我在资源字典中定义了一个元素,如下所示:

<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>

有没有人知道为什么在运行时可能会出现这种特定用法?它动态创建的事实是否与它有关?

提前致谢, 斯科特

2 个答案:

答案 0 :(得分:0)

我猜测它不起作用的原因是WPF如何以及何时查找和绑定静态资源的一些怪癖。我的猜测是,你加载程序集的方式比你实例化对象的方式更多(通过Activator.CreateInstance的反射),但我可能完全关闭,更熟悉WPF内部的人必须肯定地说

但是,解决方法应该很简单:改用DynamicResourceDynamicResource更像普通绑定,并且在解析引用时应该没有问题。

答案 1 :(得分:0)

当这不起作用时,我已经多次单击链接。每次答案都是我在键名后添加一个空格,如下所示: x:Key="Name " 我经常怀念这个,而且我似乎也从来没有学过。