天天看點

2018-8-10-win10-uwp-使用-Geometry-resources-在-xaml

title author date CreateTime categories
win10 uwp 使用 Geometry resources 在 xaml lindexi 2018-08-10 19:17:19 +0800 2018-2-13 17:23:3 +0800 Win10 UWP

經常會遇到在 xaml 使用矢量圖,對于 svg 的矢量圖,一般都可以拿出來寫在 Path 的 Data ,是以可以寫為資源,但是寫出來的是字元串,如何綁定 Geometry 到字元串資源?

假如在資源寫一個圖檔,看起來就是下面的代碼

<Page.Resources>
    <x:String x:Key="HomeIconGeometry">F1 M 24.0033,56.0078L 24.0033,38.0053L 22.0031,40.0056L 19.0027,35.0049L 38.0053,20.0028L 45.0063,25.5299L 45.0063,21.753L 49.0068,21.0029L 49.0068,28.6882L 57.008,35.0049L 54.0075,40.0056L 52.0073,38.0053L 52.0073,56.0078L 24.0033,56.0078 Z M 38.0053,26.9204L 27.0038,36.005L 27.0038,53.0074L 33.0046,53.0074L 33.0046,42.006L 43.006,42.006L 43.006,53.0074L 49.0068,53.0074L 49.0068,36.005L 38.0053,26.9204 Z</x:String>
</Page.Resources>      

然後發現使用的是 string ,如果這時建立了一個使用者控件,裡面寫了一個屬性,請看代碼

public Geometry IconData
{
    get { return (Geometry)GetValue(IconDataProperty); }
    set { SetValue(IconDataProperty, value); }
}

public static readonly DependencyProperty IconDataProperty = 
    DependencyProperty.Register(nameof(IconData), typeof(Geometry), typeof(Header), new PropertyMetadata(null);      

界面直接使用代碼

<local:Header x:Name="HeaderPanel" IconData="{StaticResource HomeIconGeometry}" />      

就會在運作出現無法從string轉換,但是如何把使用者控件改為 Path ,就可以運作

​​

2018-8-10-win10-uwp-使用-Geometry-resources-在-xaml

那麼如何在使用者控件使用資源的字元串

可以使用綁定,如果無法轉換,可以寫一個轉換

先建立一個轉換類

public class GeometryConvert : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is string str)
        {
            var geometry = (Geometry) XamlReader.Load(
                "<Geometry xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>"
                + str + "</Geometry>");
            return geometry;
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}      

然後在使用綁定的地方使用轉換

<local:GeometryConvert x:Key="GeometryConvert"></local:GeometryConvert>

<local:Header x:Name="HeaderPanel" IconData="{Binding Source={StaticResource HomeIconGeometry},Converter={StaticResource GeometryConvert}}" />      

可以看到,這個方法可以顯示圖檔

2018-8-10-win10-uwp-使用-Geometry-resources-在-xaml

是以,需要綁定字元串,可以使用這個方法。

有人說,綁定到字元串可以不使用轉換,他可以做到,直接使用綁定,但是我暫時沒法