c# - WPF 我的程序出现“MarkupExtension 对 Setter.Value 无效”错误,但在运行时工作正常
问题描述
<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>
错误提示出现在<Style x:Key="HeaderTitle" ... >
. 如果我将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 项目。
- 将资源(字体和图像)包含到项目中并将它们构建为“资源”。
- 将源代码复制到
<application.resources>
部分。(直到这一步一切都还好,没有出现任何错误消息。) - 按“运行”执行您的程序,会出现一个空白窗口(我们还没有编写 xaml 代码),然后按“停止”退出调试/运行时。
- 现在出现错误消息。
- 将源代码复制到 xaml 页面并再次运行程序。
- 虽然有一些错误,但程序在运行时运行良好,所有资源(字体和图像)都正确显示。
- 错误截图
- xaml 页面上的程序运行时和错误
我的临时解决方案:
- 删除我的 StaticResource 变量名称的一个字符,"NotoBold" => "otoBold"
- 现在错误消息变为无法识别“otoBold”......
- 撤消编辑,“otoBold”=>“NotoBold”
- 所有错误消息都消失了。XAML 设计器还正确显示 Noto 字体。
现在每次调试后,我都必须重新修复所有内容,否则我的 xaml 设计器视图将无法正确显示(某些控件的样式属性不会生效)。
解决方案
请尝试修改代码如下:
<Setter Property="FontFamily" Value="{DynamicResource NotoBold}" />
在应用程序实际运行之前加载 XAML 期间,将解析StaticResource并将其分配给属性。它只会被分配一次,并且对资源字典的任何更改都会被忽略。
DynamicResource在加载期间将一个Expression 对象分配给该属性,但直到运行时要求该 Expression 对象提供值时才实际查找该资源。这会延迟查找资源,直到在运行时需要它。你可以根据具体情况来分析是使用DynamicResource还是StaticResource
推荐阅读
- python - 使用 openpyxl 创建饼图时,max_col 仅选择两列
- python - 在 Python 中的 for 循环中创建 JSON
- ajax - 用ajax下载flask excel
- apache-kafka - Spring-kafka-listener:使用手动确认的最后一条消息后仍保留偏移量
- react-native - react-navigation BottomTabNavigator 在生产中被切断
- python - KeyError:“[Int64Index dtype='int64', length=9313)] 都不在 [columns] 中”
- typescript - 使用约束创建映射类型的对象
- javascript - javascript如何分配参考值?
- javascript - 合并和组合具有相同日期的数组项
- r - 通过删除括号内的所有文本