资源别名(WPF)

5
我正在尝试在XAML中创建资源别名,如下所示:

<UserControl.Resources>

    <StaticResourceExtension x:Key="newName" ResourceKey="oldName"/>

</UserControl.Resources>

oldName 简单地指代了一个在 App.xaml 中定义的类型为 Image 的资源。

据我所知,这是正确的做法,并且应该可以正常工作。然而,XAML 代码给出了一个极其不明确的错误:

"The application XAML file failed to load. Fix errors in the application XAML before opening other XAML files."

当我将鼠标悬停在代码中的StaticResourceExtension行上时(该行下有波浪线),就会出现此错误。实际的错误列表中生成了几个其他错误,但似乎都不太相关和荒唐无稽(例如“当前上下文中不存在'InitializeComponent'的名称”),因为当删除该行时,它们全部消失。
我完全被卡住了。为什么WPF会抱怨这段代码呢?请问有解决方法吗?
注意:我在.NET 3.5 SP1中使用WPF。
更新1: 我应该澄清一点,我确实收到编译器错误(在错误列表中提到的那些消息),所以这不仅仅是一个设计问题。
更新2: 以下是完整的相关代码,位于App.xaml(在下):
<Image x:Key="bulletArrowUp" Source="Images/Icons/bullet_arrow_up.png" Stretch="None"/>
<Image x:Key="bulletArrowDown" Source="Images/Icons/bullet_arrow_down.png" Stretch="None"/>

并在 MyUserControl.xaml 文件中(在 UserControl.Resources 下):

<StaticResourceExtension x:Key="columnHeaderSortUpImage" ResourceKey="bulletArrowUp"/>
<StaticResourceExtension x:Key="columnHeaderSortDownImage" ResourceKey="bulletArrowDown"/>

当然,这些是生成错误的代码行。

2个回答

3

尽管我已经尝试了很多次,但我无法复现您的问题。我认为这不仅仅是您发布的代码的问题。以下代码对我来说可以正常工作:

App.xaml:

<Application x:Class="WpfApplication1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml">
    <Application.Resources>
        <Image x:Key="bulletArrowUp" Source="Leaves.jpg" Stretch="None"/>
        <Image x:Key="bulletArrowDown" Source="Leaves.jpg" Stretch="None"/>
    </Application.Resources>
</Application>

Window1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <local:UserControl1/>
</Window>

UserControl1.xaml:

<UserControl x:Class="WpfApplication1.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Resources>
        <StaticResourceExtension x:Key="columnHeaderSortUpImage" ResourceKey="bulletArrowUp"/>
        <StaticResourceExtension x:Key="columnHeaderSortDownImage" ResourceKey="bulletArrowDown"/>
    </UserControl.Resources>
    <ContentControl Content="{StaticResource columnHeaderSortUpImage}"/>
</UserControl>

我将 Leaves.jpg 图像添加到我的项目中,它显示得非常好。


谢谢回复。不幸的是,实际编译器错误被生成了(无意义的消息,如果我不定义别名,所有这些消息都会消失)。不确定是否有区别,但您是否注意到我正在使用的资源是“Image”元素? - Noldorin
我已经更新了我的答案 - 对我来说仍然很好用。我甚至已经让一个图像显示在用户控件内部。 - Kent Boogaart
@Kent:我复制了你的示例,看起来对我也很有效。(老实说,我应该早点尝试一下!)在这里要准确的说,我实际上是将资源嵌套在App.xaml中的ResourceDictionary中,但是这在我的示例项目中没有任何区别。这个问题真的让我困扰了好久......“InitializeComponent”错误会给你任何提示吗? - Noldorin
@Kent:我刚刚注意到在出现错误时UserControl.g.cs文件没有被生成 - 这可能是导致错误的原因。为什么它没有被生成,我不知道。 - Noldorin

1
我尝试使用与肯特相同的设置,但收到以下错误:
Property 'Resources' does not support values of type 'System.Windows.Controls.Image'.

我也试过其他几种类型,但结果都一样(只是完全限定的类型名称不同)。

我只能以以下方式重新键入<UserControl.Resources>中的图像:

<UserControl.Resources>
    <Image x:Key="myimg"
           Source="{Binding Source={StaticResource appimg}, Path=Source}"
           Stretch="{Binding Source={StaticResource appimg}, Path=Stretch}"/>
</UserControl.Resources>

我不得不想:为什么?资源并不是设计成可以重新键入的。我怀疑你最终想要实现的目标可能可以通过其他更好、更容易的方式来完成。可能需要使用样式中的设置器。

1
我收到了相同的错误,但我注意到项目实际上已经成功构建。我能够运行该项目,并且它按预期工作。我认为你遇到的特定错误可能来自于VS内部的XAML验证器,与构建过程无关。 - Bryce Kahle
你说得对。所以当我看到“构建成功”的字样在错误面板弹出之前一瞬间出现时,我的眼睛并没有出现幻觉。 - Joel B Fant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接