UWP中MarkupExtension的使用

       Xaml做爲一種描述語言,在編程中極大地簡化了頁面開發的繁瑣及時間消耗,這得益於它的多種特性:數據綁定、動畫、資源文件等等。標記擴展做爲其一個特性,在xaml中有不可替代的做用,今天分析下自定義標記擴展怎麼實現。git

       作過WPF項目的可能比較熟悉,自定義標記擴展繼承MarkupExtension並實現其ProvideValue方法,便可實現。可是在UWP中,有些許區別。github

  • 項目的最低官方支持版本爲:Windows 10 Fall Creators Update (introduced v10.0.16299.0)。

    項目中的Target version必須是16299及以上版本,否則Framework沒有MarkupExtension這個類。Min version也必須是16299及以上版本,若低於該版本,會提示缺乏「UAP,verson=v10.0.16299.0」的framework。遇到這個錯誤須要將nuget中下圖的類庫更新到高版本,具體哪一個版本以上未驗證,我是更新到6.1.7就能夠了。編程

          

                

  • 配置方面完成後,下面講解實現過程。
    自定義一個類,繼承自MarkupExtension,重寫基類的ProvideValue方法。類命名若以extension結尾在Xaml引用時,會自動將該文字過濾掉,只保留前半部分。

        

using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Markup;

namespace Passworder.Framework.ExtendBinding
{
    [Bindable]
    [MarkupExtensionReturnType(ReturnType =typeof(string))]
    public class PageDataContextBindingExtension : MarkupExtension
    {
        public string PropertyName { get; set; }

        protected override object ProvideValue()
        {
            return "This is test";
        }
    }
}

       與WPF區別是,WPF的ProvideValue方法有一個IServiceProviderv參數,經過該參數能夠更方便地實現某些功能,UWP中閹割了該功能。windows

       頁面中,添加對該類庫的引用,而後Xaml代碼以下便可:api

xmlns:eb="using:XXXX.XXXX.XXXXX"
<MenuFlyoutItem Text="{eb:PageDataContextBinding PropertyName=111}"/>

 

MS文檔參考:https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.markup.markupextensionide

GIT實例參考:https://github.com/michael-hawker/UWPCommunityToolkit/blob/mhawker/uniformgrid-as-grid/Microsoft.Toolkit.Uwp.UI/Extensions/Markup/NullableBool.cs動畫

相關文章
相關標籤/搜索