国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

WPF換膚設(shè)計原理淺析

2020-01-24 00:58:27
字體:
供稿:網(wǎng)友

WPF換膚的設(shè)計原理,利用資源字典為每種皮膚資源添加不同的樣式,在后臺切換皮膚資源文件。

截圖


上圖中,第一張圖采用規(guī)則樣式,第二張圖采用不規(guī)則樣式,截圖的時候略有瑕疵。

資源字典

規(guī)則樣式資源Skin.RegularStyle.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!--Window樣式--> <Style x:Key="WindowStyle" TargetType="Window">  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="Window">     <Border BorderBrush="{TemplateBinding BorderBrush}"        BorderThickness="{TemplateBinding BorderThickness}">      <Border.Background>       <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">        <GradientStop Color="Green" Offset="0"></GradientStop>        <GradientStop Color="LightGreen" Offset="0.4"></GradientStop>        <GradientStop Color="White" Offset="1"></GradientStop>       </LinearGradientBrush>      </Border.Background>      <ContentPresenter></ContentPresenter>     </Border>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--Button樣式--> <Style TargetType="Button">  <Setter Property="Width" Value="70"></Setter>  <Setter Property="Height" Value="23"></Setter>  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="Button">     <Border Name="bdr" Cursor="Arrow"       BorderBrush="{TemplateBinding BorderBrush}"        BorderThickness="{TemplateBinding BorderThickness}">      <Border.Background>       <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">        <GradientStop Color="White" Offset="0"></GradientStop>        <GradientStop Color="LightGreen" Offset="0.3"></GradientStop>        <GradientStop Color="Green" Offset="1"></GradientStop>       </LinearGradientBrush>      </Border.Background>      <TextBlock Name="tbk" Background="Transparent" Foreground="DarkGreen" TextAlignment="Center"         Text="{TemplateBinding Content}"></TextBlock>     </Border>     <ControlTemplate.Triggers>      <Trigger Property="IsMouseOver" Value="True">       <Setter TargetName="bdr" Property="Background">        <Setter.Value>         <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">          <GradientStop Color="LightGreen" Offset="0"></GradientStop>          <GradientStop Color="Green" Offset="1"></GradientStop>         </LinearGradientBrush>        </Setter.Value>       </Setter>       <Setter TargetName="tbk" Property="Foreground" Value="White"></Setter>      </Trigger>     </ControlTemplate.Triggers>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--TextBox樣式--> <Style TargetType="TextBox">  <Setter Property="FontFamily" Value="SketchFlow Print"/>  <Setter Property="FontSize" Value="14"/>  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="TextBox">     <Border BorderBrush="DarkGreen" BorderThickness="0.5">      <ScrollViewer x:Name="PART_ContentHost" Focusable="false"           HorizontalScrollBarVisibility="Hidden"           VerticalScrollBarVisibility="Hidden"></ScrollViewer>     </Border>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--ContextMenu樣式--> <Style TargetType="ContextMenu">  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="ContextMenu">     <Border BorderBrush="Green" BorderThickness="1">      <ItemsPresenter/>     </Border>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--MenuItem樣式--> <Style TargetType="MenuItem">  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="MenuItem">     <Border Name="border" Background="LightGreen" BorderThickness="0">      <TextBlock Name="tbk" Background="Transparent" Padding="5,5"         Text="{TemplateBinding Header}"></TextBlock>     </Border>     <ControlTemplate.Triggers>      <Trigger Property="IsMouseOver" Value="True">       <Setter TargetName="border" Property="Background" Value="Green"></Setter>       <Setter TargetName="tbk" Property="Foreground" Value="White"></Setter>      </Trigger>     </ControlTemplate.Triggers>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--TextBlock樣式--> <Style TargetType="TextBlock">  <Setter Property="FontFamily" Value="SketchFlow Print"/>  <Setter Property="FontSize" Value="14"/> </Style></ResourceDictionary>不規(guī)則樣式資源Skin.RoundedCornerStyle.xaml<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!--Window樣式--> <Style x:Key="WindowStyle" TargetType="Window">  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="Window">     <Grid Margin="10">      <Rectangle Fill="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"          RadiusX="5" RadiusY="5">       <Rectangle.Effect>        <DropShadowEffect BlurRadius="10" Color="Black" Direction="0" Opacity="0.8"             RenderingBias="Performance" ShadowDepth="0"/>       </Rectangle.Effect>      </Rectangle>      <Border BorderBrush="{TemplateBinding BorderBrush}"         BorderThickness="{TemplateBinding BorderThickness}"         SnapsToDevicePixels="True" CornerRadius="5">       <Border.Background>        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">         <GradientStop Color="Blue" Offset="0"></GradientStop>         <GradientStop Color="LightBlue" Offset="0.4"></GradientStop>         <GradientStop Color="White" Offset="1"></GradientStop>        </LinearGradientBrush>       </Border.Background>       <ContentPresenter></ContentPresenter>      </Border>     </Grid>    </ControlTemplate>   </Setter.Value>  </Setter> </Style>  <!--Button樣式--> <Style TargetType="Button">  <Setter Property="Width" Value="70"></Setter>  <Setter Property="Height" Value="23"></Setter>  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="Button">     <Border Name="bdr" CornerRadius="5" Cursor="Hand"       BorderBrush="{TemplateBinding BorderBrush}"        BorderThickness="{TemplateBinding BorderThickness}">      <TextBlock Name="tbk" Background="Transparent" Foreground="Yellow" TextAlignment="Center"         Text="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Content}"></TextBlock>      <Border.Background>       <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">        <GradientStop Color="White" Offset="0"></GradientStop>        <GradientStop Color="LightBlue" Offset="0.3"></GradientStop>        <GradientStop Color="Blue" Offset="1"></GradientStop>       </LinearGradientBrush>      </Border.Background>     </Border>     <ControlTemplate.Triggers>      <Trigger Property="IsMouseOver" Value="True">       <Setter TargetName="bdr" Property="Background">        <Setter.Value>         <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">          <GradientStop Color="LightBlue" Offset="0"></GradientStop>          <GradientStop Color="Blue" Offset="1"></GradientStop>         </LinearGradientBrush>        </Setter.Value>       </Setter>       <Setter TargetName="tbk" Property="Foreground" Value="LightYellow"></Setter>      </Trigger>     </ControlTemplate.Triggers>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--TextBox樣式--> <Style TargetType="TextBox">  <Setter Property="FontFamily" Value="Times New Roman"></Setter>  <Setter Property="FontSize" Value="14"></Setter>  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="TextBox">     <Border BorderBrush="Blue" BorderThickness="0.5" CornerRadius="5">      <ScrollViewer x:Name="PART_ContentHost" Focusable="false"           HorizontalScrollBarVisibility="Hidden"           VerticalScrollBarVisibility="Hidden"></ScrollViewer>     </Border>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--ContextMenu樣式--> <Style TargetType="ContextMenu">  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="ContextMenu">     <Border CornerRadius="5" BorderBrush="Blue" BorderThickness="1">      <ItemsPresenter/>     </Border>    </ControlTemplate>   </Setter.Value>  </Setter> </Style> <!--MenuItem樣式--> <Style TargetType="MenuItem">  <Setter Property="Template">   <Setter.Value>    <ControlTemplate TargetType="MenuItem">     <Border Name="border" Background="LightSkyBlue" BorderThickness="0" CornerRadius="5">      <TextBlock Name="tbk" Background="Transparent" Padding="5,5"         Text="{TemplateBinding Header}"></TextBlock>     </Border>     <ControlTemplate.Triggers>      <Trigger Property="IsMouseOver" Value="True">       <Setter TargetName="border" Property="Background" Value="BlueViolet"></Setter>       <Setter TargetName="tbk" Property="Foreground" Value="White"></Setter>      </Trigger>     </ControlTemplate.Triggers>    </ControlTemplate>   </Setter.Value>  </Setter> </Style>  <!--TextBlock樣式--> <Style TargetType="TextBlock">  <Setter Property="FontFamily" Value="Times New Roman"/>  <Setter Property="FontSize" Value="14"/> </Style></ResourceDictionary>

仔細觀察上面定義的樣式,你會發(fā)現(xiàn)在定義Window樣式的時候指定了Key,其他的Control樣式卻沒有指定Key。大家都知道,如果沒有給Style指定Key,那么這個Style會應(yīng)用到所有目標(biāo)類型(TargetType)為指定類型的Control。請看下面一段文字:

因為在換膚的過程中,需要動態(tài)加載Window的樣式,所以用DynamicResource作綁定Style="{DynamicResource WindowStyle}"。

App.xaml

程序運行的時候,默認(rèn)加載規(guī)則樣式的皮膚。

<Application.Resources>  <ResourceDictionary>   <ResourceDictionary.MergedDictionaries>    <ResourceDictionary Source="Dictionary/Skin.RegularStyle.xaml"></ResourceDictionary>   </ResourceDictionary.MergedDictionaries>  </ResourceDictionary> </Application.Resources>

后臺代碼

/// <summary>  /// MenuItem的執(zhí)行方法  /// </summary>  /// <param name="parameter"></param>  private void RelayMenuItemEvent(object parameter)  {   if (parameter.ToString() == RegularStyle)   {    ChangeSkinResource(Skins[0]);   }   else if (parameter.ToString() == RoundedCornerStyle)   {    ChangeSkinResource(Skins[1]);   }  }  /// <summary>  /// 更換皮膚資源  /// </summary>  /// <param name="skin"></param>  private void ChangeSkinResource(ResourceDictionary skin)  {   if (Application.Current.Resources.MergedDictionaries[0].Source.IsAbsoluteUri)   {    if (Application.Current.Resources.MergedDictionaries[0].Source.OriginalString != skin.Source.OriginalString)    {     Application.Current.Resources.MergedDictionaries[0] = skin;    }   }   else   {    if (Application.Current.Resources.MergedDictionaries[0].Source.OriginalString.ToString('//') != skin.Source.OriginalString.ToString('/'))    {     Application.Current.Resources.MergedDictionaries[0] = skin;    }   }  }

運行的時候在MainWindow上右鍵選擇皮膚樣式,就可以換膚了。

源碼下載:http://xiazai.VeVB.COm/201610/yuanma/WPFSkin(VeVB.COm).rar

鏈接:stackoverflow

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 辽阳县| 永城市| 桐梓县| 大厂| 库尔勒市| 舒兰市| 视频| 濮阳县| 温宿县| 揭东县| 宜昌市| 黑山县| 普兰县| 莱芜市| 苗栗县| 武夷山市| 景东| 平凉市| 高州市| 海林市| 海安县| 淮北市| 和顺县| 西乡县| 开江县| 彭泽县| 宜州市| 锡林浩特市| 驻马店市| 嵊泗县| 砚山县| 靖西县| 新晃| 龙泉市| 嵊泗县| 鲜城| 五指山市| 张家界市| 汕尾市| 日土县| 遂川县|