WPF 我的程序有 "MarkupExtension is not valid for Setter.Value" 错误但在运行时工作正常
WPF my program has "MarkupExtension is not valid for Setter.Value" error but working fine in runtime
只有当我将 <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>
After (added ImageSource xkey='RedCircle1' => 1 error):
<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 Studio2019版本是16.8.3。我所有的资源文件(Noto 字体和 circleRed1.png)它们的构建操作都是“资源”。
重现问题的步骤。
- 创建一个新的 WPF .NET 项目。
- 将资源(字体和图像)包含到项目中并将它们构建为“资源”。
- 将源代码复制到
<application.resources>
部分。
(直到这一步一切都很好,没有任何错误信息出现。)
- 按“运行”执行你的程序,会出现一个空白window(我们还没有代码xaml),然后按“停止”退出debugging/runtime.
- 现在出现错误消息。
- 将源代码复制到 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 设计器视图将无法正确显示(某些控件的样式属性将不会生效)。
请尝试修改如下代码:
<Setter Property="FontFamily" Value="{DynamicResource NotoBold}" />
A StaticResource 将在加载 XAML 期间解析并分配给 属性,这发生在应用程序实际 运行 之前。它只会被分配一次并且忽略对资源字典的任何更改。
A DynamicResource 在加载期间将 Expression 对象分配给 属性,但直到 运行 请求 Expression 对象的值时才真正查找资源。这推迟查找资源,直到在 运行 时间需要它。
大家可以根据具体情况分析是使用DynamicResource还是StaticResource
只有当我将 <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>
After (added ImageSource xkey='RedCircle1' => 1 error):
<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 Studio2019版本是16.8.3。我所有的资源文件(Noto 字体和 circleRed1.png)它们的构建操作都是“资源”。
重现问题的步骤。
- 创建一个新的 WPF .NET 项目。
- 将资源(字体和图像)包含到项目中并将它们构建为“资源”。
- 将源代码复制到
<application.resources>
部分。 (直到这一步一切都很好,没有任何错误信息出现。) - 按“运行”执行你的程序,会出现一个空白window(我们还没有代码xaml),然后按“停止”退出debugging/runtime.
- 现在出现错误消息。
- 将源代码复制到 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 设计器视图将无法正确显示(某些控件的样式属性将不会生效)。
请尝试修改如下代码:
<Setter Property="FontFamily" Value="{DynamicResource NotoBold}" />
A StaticResource 将在加载 XAML 期间解析并分配给 属性,这发生在应用程序实际 运行 之前。它只会被分配一次并且忽略对资源字典的任何更改。
A DynamicResource 在加载期间将 Expression 对象分配给 属性,但直到 运行 请求 Expression 对象的值时才真正查找资源。这推迟查找资源,直到在 运行 时间需要它。 大家可以根据具体情况分析是使用DynamicResource还是StaticResource