WPF中資源字典(ResourceDictionary)的使用

SQWH_SSGS發表於2020-11-16

資源字典(ResourceDictionary)的使用

1、建立資原始檔

各資原始檔中,若需要引入專案中其它檔案,則可通過名稱空間引入。對應各資源元素,設定x:key值。程式碼中通過x:key值獲取相應的資源。以引數值轉換器為例。

ValueConverter.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:valueConvert="clr-namespace:AHUSelectorPlatformUI.ValueConvert">


    <!--介面顯示相關-->
    <valueConvert:ConvertWindMachineTypeToTreeViewSource x:Key="ConvertToTreeViewSource"/>    
    <valueConvert:UnitPowerConvert x:Key="UnitPowerConvert"/>
    <!--........-->
</ResourceDictionary>

2、專案中引入資源

有以下兩種方法

1、WPF專案中的app.xaml檔案中,可以通過ResourceDictionary標籤,引入各類資源。如下程式碼,其中引入了自定義樣式、資料模板、窗體介面模板、數值轉換器等資源。不同的資源位於不同的檔案地址,可直接通過Source屬性連結資源路徑。

<Application x:Class="AHUSelectorPlatform.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             StartupUri="View\Login.xaml"
             mc:Ignorable="d">
    <Application.Resources>

        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries>

                <ResourceDictionary Source="/Resources/Style/SimpleStyles.xaml" />
                <ResourceDictionary Source="/Resources/SettingResource/ValueConverter.xaml" />
                <ResourceDictionary Source="/View/Segments/DataTemplate/SegmentDataTemplate.xaml" />
                <ResourceDictionary Source="/Resources/SettingResource/WindowResource.xaml" />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

2、通過newResourceDictionary的方式建立資源並繫結。

public static void loadRd()
{
    var brushes_rd = new ResourceDictionary()
    {
        Source = new Uri("pack://Application:,,,/testXml;component/dictionary.xaml")
    };
    Application.Current.Resources = new ResourceDictionary()
    {
        MergedDictionaries =
        {
            brushes_rd
        }
    };
}

3、使用資源

引入資源後,專案中則可通過各類的方法,獲取到相應的資源。

  1. 介面引數繫結時,可以使用引數值轉換器進行引數轉換。如下拉值轉換成文字。數值轉換成物件等。如下程式碼,BrandConvert為ValueConverter.xaml中的資源。

  2. 設定靜態資源來源。如下程式碼,UIDataContainer為SimpleStyles.xaml中的資源。

    <ComboBox Name="FanBrand" SelectedIndex="{Binding FanBrand,Converter={StaticResource BrandConvert},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                        <ComboBoxItem Content="{Binding StandardFanBrand, Mode=OneWay, Source={StaticResource UIDataContainer}, UpdateSourceTrigger=PropertyChanged}"/>
    </ComboBox>
    
  3. 設定資料繫結模板。如下程式碼,PressureDataTemplate為WindowResource.xaml中的資源。

    <UserControl x:Class="AHUSelectorPlatformUI.View.Segments.DLD.BlowerFanSeg"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 Height="auto" Width="300" Background="White">
        <ContentControl x:Name="ContentControl" ContentTemplate="{DynamicResource PressureDataTemplate}" Content="{Binding}" />
    </UserControl>
    
  4. 使用Application.Current.TryFindResource()方法獲取對應資源。

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
    	return Application.Current.TryFindResource(ChooseSegCodeName.WindowReflectDictionary[(SegmentID)value]) as UserControl;
    }
    

將資源全域性註冊

若定義的某個資源,需要給應用全域性使用,可以在 App.xaml 中完成註冊:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/應用程式名;component/資源的具體路徑" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

具體實現如下:

<Application x:Class="MVVMLightDemo.App" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             StartupUri="View/BindingFormView.xaml" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             d1p1:Ignorable="d" 
             xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
  <Application.Resources>
    <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/MVVMLightDemo;component/Assets/TextBox.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
  </Application.Resources>
</Application>

相關文章