【问题标题】:Aliasing Resources (WPF)别名资源 (WPF)
【发布时间】:2009-07-17 14:29:37
【问题描述】:

我正在尝试为 XAML 中的资源设置别名,如下所示:

<UserControl.Resources>

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

</UserControl.Resources>

oldName 只是指Image 类型的资源,在App.xaml 中定义。

据我了解,这是执行此操作的正确方法,并且应该可以正常工作。但是,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 中(Application.Resource 下):

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

当然,这些是产生错误的行。

【问题讨论】:

    标签: wpf xaml resources antialiasing


    【解决方案1】:

    尽我所能,我无法重现您的问题。我认为还有比您发布的代码更多的东西。这对我来说很好:

    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 元素?
    • 我已经更新了我的答案 - 它对我来说仍然可以正常工作。我什至在 UserControl 中显示了一张图片。
    • @Kent:我复制了你的例子,它似乎对我来说也很好。 (老实说,早该尝试过!)确切地说,我实际上将 App.xaml 中的资源嵌套在 ResourceDictionary 中,但这对我的示例项目没有影响。这个问题真的难倒我......“InitializeComponent”错误是否能给你任何提示?
    • @Kent:我还刚刚注意到,当我收到错误时,UserControl.g.cs 文件没有生成生成器——这可能是导致错误的原因。为什么它没有生成,我不知道。
    【解决方案2】:

    我尝试使用与 Kent 相同的设置并收到以下错误:

    Property 'Resources' does not support values of type 'System.Windows.Controls.Image'.
    

    我还尝试了一些其他类型,得到了相同的结果(只是使用了不同的完全限定类型名称)。

    我只能通过以下方式重新键入 &lt;UserControl.Resources&gt; 中的图像:

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

    我不得不想:为什么?资源不是为重新键入而设计的。我怀疑你最终想要完成的事情可以通过其他方式做得更好、更容易。可能与样式中的设置器一起使用。

    【讨论】:

    • 我收到了同样的错误,但我注意到项目实际上构建成功。我能够运行该项目并且它按预期工作。我认为您的特定错误可能来自 VS 内部的 XAML 验证器,它与构建过程无关。
    • 你是对的。因此,当我认为在错误面板弹出之前的一瞬间它说“构建成功”时,这并不是我的眼睛在开玩笑。
    猜你喜欢
    • 2014-12-24
    • 2014-07-10
    • 2011-12-27
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    相关资源
    最近更新 更多