WPF 我的程序出现“MarkupExtension 对 Setter.Value 无效”错误但在运行时工作正常

Posted

技术标签:

【中文标题】WPF 我的程序出现“MarkupExtension 对 Setter.Value 无效”错误但在运行时工作正常【英文标题】:WPF my program has "MarkupExtension is not valid for Setter.Value" error but working fine in runtime 【发布时间】:2021-07-05 12:02:38 【问题描述】:

此错误仅在我将<ImageSource x:key="...">图像资源文件</ImageSource> 添加到我的<application.resources> 部分时出现。但是程序在运行时运行良好,没有任何问题。

之前(原始代码 => 0 错误):

    <Application.Resources>
        <FontFamily x:Key="NotoBold">
            fonts/NotoSerifCJKtc-Bold.otf#Noto Serif CJK TC Bold
        </FontFamily>

        <Style x:Key="HeaderTitle" TargetType="TextBlock">
            <Setter Property="Grid.Column" Value="0" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="FontSize" Value="18" />
            <Setter Property="FontFamily" Value="StaticResource NotoBold" />
            <Setter Property="Foreground" Value="White" />
        </Style>
    ... ...
    ... ...
    ... ...
    </Application.Resources>

之后(添加 ImageSource xkey='RedCircle1' => 1 错误):

    <Application.Resources>
        <FontFamily x:Key="NotoBold">
            fonts/NotoSerifCJKtc-Bold.otf#Noto Serif CJK TC Bold
        </FontFamily>

        <ImageSource x:Key="RedCircle1">
            images/sample/circleRed1.png
        </ImageSource>

        <Style x:Key="HeaderTitle" TargetType="TextBlock">
            <Setter Property="Grid.Column" Value="0" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="FontSize" Value="18" />
            <Setter Property="FontFamily" Value="StaticResource NotoBold" />
            <Setter Property="Foreground" Value="White" />
        </Style>
    ... ...
    ... ...
    ... ...
    </Application.Resources>

错误提示出现在&lt;Style x:Key="HeaderTitle" ... &gt;。如果我将 setter value="StaticResource NotoBold" 更改为其他内容(例如 value="Verdana"),错误就会消失。

错误信息: MarkupExtension 对 Setter.Value 无效。唯一支持的 MarkupExtension 类型是 DynamicResourceExtension 和 BindingBase 或派生类型。

更新

我的 .Net 版本是 4.8.03752,Visual Studio 2019 版本是 16.8.3。我所有的资源文件(Noto 字体和 circleRed1.png)它们的构建操作都是“资源”。

重现问题的步骤。

创建一个新的 WPF .NET 项目。 将资源(字体和图像)包含到项目中并将它们构建为“资源”。 将源代码复制到&lt;application.resources&gt; 部分。 (在这一步之前一切都很好,没有出现任何错误消息。) 按“运行”执行程序,会出现一个空白窗口(我们还没有编写 xaml 代码),然后按“停止”退出调试/运行时。 现在出现错误消息。 将源代码复制到xaml页面并再次运行程序。 虽然有一些错误,但程序在运行时运行良好,所有资源(字体和图像)都正确显示。 screenshot of the error program runtime & error on xaml page

我的临时解决方案:

    删除我的 StaticResource 变量名称的一个字符,“NotoBold”=>“otoBold” 现在错误消息变为无法识别“otoBold”... 撤消编辑,“otoBold”=>“NotoBold” 所有错误消息都消失了。 XAML 设计器还可以正确显示 Noto 字体。
temporary solution xaml designer view after solution fix

现在每次调试后,我都必须重新修复,否则我的 xaml 设计器视图将无法正确显示(某些控件的样式属性不会生效)。

【问题讨论】:

嗨,@HelpMe,我在 Visual Studio 2019 中创建了一个 wpf 程序(.NET Framework 4.6.1),并在我的 App.xaml 中使用了您的第二部分代码,但我没有重现您的问题。您的 NotoSerifCJKtc-Bold.otf#Noto Serif CJK TC Bold 的 Properties 选项的 Build Action 是什么?它是资源、内容还是嵌入式资源?你的 circleRed1.png 的 Properties 选项的 Build Action 是什么?请提供更详细的步骤和相关代码sn-p来重现和分析问题。 @JackJJun-MSFT,我已经编辑了我的问题,请查看图片了解详情。感谢您的帮助。 嗨,@HelpMe,我在我的程序中重复了你的步骤,但我没有重现你的错误信息,它可以正常运行。您是否尝试过修改 之类的代码? 嗨@JackJJun-MSFT,“DynamicResource”是正确的答案,当我改成它时,没有更多的错误提示。似乎 部分中的每个数据绑定都应该使用“DynamicResource”而不是“StaticResource”。 您好,@HelpMe,很高兴您的问题已经解决,如果您觉得我的回复没问题,可以标记我的回复为答案。 【参考方案1】:

请尝试修改如下代码:

<Setter Property="FontFamily" Value="DynamicResource NotoBold" />

StaticResource 将在应用程序实际运行之前加载 XAML 期间解析并分配给属性。它只会被分配一次,对资源字典的任何更改都会被忽略。

DynamicResource 在加载期间将一个 Expression 对象分配给该属性,但直到运行时要求该 Expression 对象提供值时才真正查找资源。这会延迟查找资源,直到在运行时需要它。 可以根据具体情况分析使用DynamicResource还是StaticResource

【讨论】:

以上是关于WPF 我的程序出现“MarkupExtension 对 Setter.Value 无效”错误但在运行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章

blend做的wpf程序有问题

如何使 WPF 弹出窗口出现在应用程序的右下角?

WPF 应用程序中的 XamlParseException - 但仅在安装在 XP 上时才会出现

从另一个程序集运行 WPF 应用程序

在 Avalon dock 中,LayoutAnchorable WPF 应用程序没有出现 Title 和 Dock 组合按钮选项

通过 Teamviewer 连接时 WPF 应用程序崩溃