簡體   English   中英

WPF 我的程序有“MarkupExtension 對 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>

之后(添加 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 或派生類型。

更新

My.Net 版本是 4.8.03752,Visual Studio 2019 版本是 16.8.3。 我所有的資源文件(Noto 字體和 circleRed1.png)它們的構建操作都是“資源”。

重新產生問題的步驟。

  • 創建一個新的 WPF .NET 項目。
  • 將資源(字體和圖像)包含到項目中並將它們構建為“資源”。
  • 將源代碼復制到<application.resources>部分。 (直到這一步一切都還好,沒有出現任何錯誤消息。)
  • 按“運行”執行您的程序,將出現一個空白 window(我們還沒有代碼 xaml),然后按“停止”退出調試/運行時。
  • 現在出現錯誤消息。
  • 將源代碼復制到 xaml 頁面並再次運行程序。
  • 雖然有一些錯誤,但程序在運行時運行良好,所有資源(字體和圖像)都正確顯示。
  • 錯誤截圖
  • xaml 頁面上的程序運行時和錯誤

我的臨時解決方案:

  1. 刪除我的 StaticResource 變量名稱的一個字符,"NotoBold" => "otoBold"
  2. 現在錯誤消息變為無法識別“otoBold”......
  3. 撤消編輯,“otoBold”=>“NotoBold”
  4. 所有錯誤消息都消失了。 XAML 設計器也能正確顯示 Noto 字體。

現在每次調試后,我都必須重新修復所有內容,否則我的 xaml 設計器視圖將無法正確顯示(某些控件的樣式屬性不會生效)。

請嘗試修改代碼如下:

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

在加載 XAML 期間,將解析StaticResource並將其分配給屬性,這發生在應用程序實際運行之前。 它只會被分配一次,並且對資源字典的任何更改都會被忽略。

DynamicResource在加載期間將表達式 object 分配給屬性,但直到運行時才在向表達式 object 詢問值時才實際查找資源。 這會延遲查找資源,直到在運行時需要它。 你可以根據具體情況來分析是使用DynamicResource還是StaticResource

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM