1. 程式人生 > >[Songqw.Net 基礎]WPF外掛化中同步Style

[Songqw.Net 基礎]WPF外掛化中同步Style

原文: [Songqw.Net 基礎]WPF外掛化中同步Style

之前將WPF Client中的各個頁面拆分為一個個外掛,進行開發,介面是原生的還好說,一旦統一樣式,每個外掛模組都來一份資原始檔,就不合理了嘍.

先從Style入手,做一下同步.


思路是直接將Style拆離出來,即不再主框架中,也不再外掛中實現.


新建專案 :Songqw.Net.WPF.CommonStyle

新建xaml檔案, 不需要xaml.cs 刪掉即可~

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="Title" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="微軟雅黑" />
        <Setter Property="FontSize" Value="23"/>
        <Setter Property="TextOptions.TextFormattingMode" Value="Ideal" />
    </Style>

    <Style x:Key="Heading1" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="微軟雅黑" />
        <Setter Property="FontSize" Value="30" />
        <Setter Property="TextOptions.TextFormattingMode" Value="Ideal" />
    </Style>

    <Style x:Key="Heading2" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="微軟雅黑" />
        <Setter Property="FontSize" Value="16" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="TextOptions.TextFormattingMode" Value="Display" />
    </Style>

</ResourceDictionary>

新建CommonUI.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">


    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="TextBlock.xaml" />
        <!--
        <ResourceDictionary Source="More.xaml" />
        <ResourceDictionary Source="More.xaml" />
        <ResourceDictionary Source="More.xaml" />
        <ResourceDictionary Source="More.xaml" />
        <ResourceDictionary Source="More.xaml" />
        -->
    </ResourceDictionary.MergedDictionaries>



    <Thickness x:Key="ContentMargin">3,3,3,3</Thickness>
    <Style x:Key="ContentRoot" TargetType="FrameworkElement">
        <Setter Property="Margin" Value="{StaticResource ContentMargin}" />
    </Style>


</ResourceDictionary>

ResourceDictionary : 資源字典出現的初衷就在於可以實現多個專案之間的共享資源,資源字典只是一個簡單的XAML文件,該文件除了儲存希望使用的資源之外,不做任何其它的事情。

詳細介紹:http://www.cnblogs.com/tianyou/archive/2012/12/07/2806835.html

到這裡,資源專案完成.下面進行呼叫~


在主程式新增如下程式碼:

using System;
using System.Windows;


namespace Songqw.Net.WPF.Application
{
    /// <summary>
    /// App.xaml 的互動邏輯
    /// </summary>
    public partial class App
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            var r = new ResourceDictionary();


            r.MergedDictionaries.Add(new ResourceDictionary()
            {
                Source =
                new Uri("/Songqw.Net.WPF.CommonStyle;component/CommonUI.xaml",
                    UriKind.RelativeOrAbsolute)
            });
            Resources = r;
        }
    }
}

這裡要注意,確定dll檔案複製到的執行目錄



最後,在各個外掛模組中直接輸入key 即可使用

<UserControl x:Class="Songqw.Net.WPF.Plugins.WpfPart1"
             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" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FF7C44F5" Offset="0"/>
                <GradientStop Color="White" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>

        <TextBlock Style="{StaticResource Heading1}" HorizontalAlignment="Left" Margin="32,45,0,0" TextWrapping="Wrap" Text="Head1 Style" VerticalAlignment="Top" Width="193"/>
        <TextBlock Style="{StaticResource Heading2}"  HorizontalAlignment="Left" Margin="32,81,0,0" TextWrapping="Wrap" Text="Head2 Style" VerticalAlignment="Top" Width="193"/>

    </Grid>
</UserControl>
 

最開始以為每個外掛都需要載入資源字典才可以執行,實際上不是的,主需要主程式載入了資源字典,各個載入模組的外掛是可以訪問到主程式中的樣式的.

換句話說,即時不把樣式從主程式中分離出來,也是可以的.

既然能分離,還是就分離了吧,也為自動更新鋪一下路.主程式儘量不更新了被.

呵呵