WPF 我的程序有"MarkupExtension is not valid for 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" ... >上。如果我改变设置值="0";{StaticResource NotoBold}">到其他值(例如value="Verdana"(,则错误将消失。

错误消息:MarkupExtension对Setter.Value无效。仅支持DynamicResourceExtension和BindingBase类型或派生类型

更新

我的.Net版本是4.8.03752,Visual Studio 2019版本是16.8.3。我的所有资源文件(Noto-font和circleRed1.png(的构建操作都是";资源";。

重新产生问题的步骤。

  • 创建一个新的WPF.NET项目
  • 将资源(字体和图像(包括到项目中,并将其构建为";资源">
  • 将源代码复制到<application.resources>部分。(在此步骤之前,一切正常,不会出现任何错误消息。(
  • 按下";运行";要执行您的程序,将出现一个空白窗口(我们还没有编写xaml代码(,然后按";停止";以退出调试/运行时
  • 现在出现错误消息
  • 将源代码复制到xaml页面中,然后再次运行该程序
  • 虽然有一些错误,但程序在运行时运行良好,所有资源(字体和图像(都显示正确
  • 错误的屏幕截图
  • 程序运行时&xaml页面出错

我的临时解决方案:

  1. 删除我的StaticResource变量名中的一个字符";NotoBold"=>quot;otoBold">
  2. 现在错误消息变为"无法识别";otoBold">
  3. 撤消编辑;otoBold"=>quot;NotoBold">
  4. 所有错误消息都消失了。XAML设计器还正确显示Noto字体
  • 临时解决方案
  • 解决方案修复后的xaml设计器视图

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

请尝试修改如下代码:

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

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

DynamicResource在加载期间将Expression对象分配给属性,但直到运行时Expression对象被要求获取值时才实际查找资源。这将推迟查找资源,直到运行时需要它为止。您可以根据的具体情况分析是使用DynamicResource还是StaticResource

相关内容

最新更新