亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WPF換膚設計原理淺析

2020-01-24 00:58:27
字體:
來源:轉載
供稿:網友

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

截圖


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

資源字典

規則樣式資源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>不規則樣式資源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>

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

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

App.xaml

程序運行的時候,默認加載規則樣式的皮膚。

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

后臺代碼

/// <summary>  /// MenuItem的執行方法  /// </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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久噜噜噜久久久| 日韩欧美aⅴ综合网站发布| 欧美乱妇40p| 色综合导航网站| 成人黄在线观看| 97超级碰碰碰久久久| 国产伦精品一区二区三区精品视频| 国产精品海角社区在线观看| 国产日韩欧美黄色| 91国内揄拍国内精品对白| 久久久久成人精品| 亚洲欧洲视频在线| 国产欧美亚洲精品| 国产日韩欧美在线播放| 欧美理论电影在线播放| 国产综合福利在线| 久久久999国产精品| 国产一区二区在线免费| 亚洲美女动态图120秒| 国产精品黄色影片导航在线观看| 亚洲精品欧美一区二区三区| 日本高清不卡的在线| 亚洲国产成人91精品| 97视频在线观看免费高清完整版在线观看| 青青在线视频一区二区三区| 欧美激情啊啊啊| 91国产精品视频在线| 国产欧美日韩高清| 亚洲精品视频在线观看视频| 欧美日韩免费一区| 57pao精品| 庆余年2免费日韩剧观看大牛| 中文字幕亚洲自拍| 91亚洲精品视频| 亚洲品质视频自拍网| 蜜臀久久99精品久久久无需会员| 亚洲欧美中文另类| 亚洲国内精品在线| 欧美丝袜一区二区三区| 欧美日韩一区二区三区在线免费观看| 久久久噜噜噜久久久| 欧美激情亚洲国产| 亚洲国产精久久久久久| 国产精品ⅴa在线观看h| 97色在线观看| 国产精品视频yy9099| 亚洲精品国产福利| 亚洲精品日产aⅴ| 日韩中文av在线| 欧美性受xxxx白人性爽| 91在线视频导航| 亚洲精品国精品久久99热一| 亚洲最大激情中文字幕| 一区二区三区在线播放欧美| 日韩欧美在线视频免费观看| 色婷婷**av毛片一区| 欧美性xxxx极品hd满灌| 91免费综合在线| 97精品国产aⅴ7777| 亚洲精品一区av在线播放| 日韩免费精品视频| 成人在线播放av| 国产美女久久精品| 久久中文久久字幕| 日韩成人性视频| 国产伦精品一区二区三区精品视频| 日韩欧美极品在线观看| 久久视频免费观看| 久久久久久香蕉网| 国产不卡在线观看| 日韩国产欧美精品一区二区三区| 国产成人中文字幕| 国产精品毛片a∨一区二区三区|国| 久久久精品国产网站| 97精品视频在线观看| 日韩激情av在线播放| 亚洲精品乱码久久久久久金桔影视| 欧美在线一区二区视频| 色午夜这里只有精品| 精品国产91乱高清在线观看| 亚洲天堂影视av| 欧美性开放视频| 久久久久久久久久国产| 疯狂蹂躏欧美一区二区精品| 在线午夜精品自拍| 欧美黄色三级网站| 亚洲视频axxx| 日韩中文字幕视频在线观看| 欧洲中文字幕国产精品| 精品福利在线看| 欧美巨猛xxxx猛交黑人97人| 国产精品香蕉av| 欧美性videos高清精品| 午夜欧美不卡精品aaaaa| 国产成人精品亚洲精品| 国产精品揄拍500视频| 自拍亚洲一区欧美另类| 欧美高清在线观看| 红桃av永久久久| 亚洲欧美国内爽妇网| 久精品免费视频| 日韩美女视频免费看| 亚洲国产成人爱av在线播放| 久操成人在线视频| 精品无人区太爽高潮在线播放| 精品毛片三在线观看| 欧美激情一区二区三区成人| 久久亚洲国产成人| 国产欧美精品xxxx另类| 成年无码av片在线| 亚洲精品免费一区二区三区| 欧美黄色片免费观看| 国产精品美乳一区二区免费| 日韩精品极品在线观看播放免费视频| www.99久久热国产日韩欧美.com| 国产精品欧美激情在线播放| 国产999在线| 8050国产精品久久久久久| 少妇av一区二区三区| 亚洲欧洲在线免费| 9.1国产丝袜在线观看| 久久伊人色综合| 人妖精品videosex性欧美| 国产精品久久一区主播| 欧美老少配视频| 91九色单男在线观看| 亚洲国产又黄又爽女人高潮的| 黑丝美女久久久| 国产精品三级久久久久久电影| 黑人极品videos精品欧美裸| 91老司机精品视频| 在线免费观看羞羞视频一区二区| 日韩精品视频免费在线观看| 久久av在线播放| 精品欧美激情精品一区| 在线视频免费一区二区| 亚洲精品天天看| 久久久久久国产三级电影| 国产精品私拍pans大尺度在线| 久久久亚洲福利精品午夜| 欧美日韩国产一区二区三区| 国外视频精品毛片| 日韩一区二区三区在线播放| 亚洲色图美腿丝袜| 欧美日韩国产在线| 国产一区二区av| 国产综合久久久久| 欧洲午夜精品久久久| 国产成人97精品免费看片| 久久五月天色综合| 国产成人精彩在线视频九色| 97香蕉久久夜色精品国产| 亚洲精品电影在线| 亚洲人午夜色婷婷| 6080yy精品一区二区三区| 国产v综合ⅴ日韩v欧美大片| 久久国产精彩视频| 色婷婷av一区二区三区久久| 亚洲欧洲高清在线| 日韩激情av在线免费观看| 亚洲第一页中文字幕| 国产精品久久久久久久天堂| 欧美在线一级视频| 国产午夜精品理论片a级探花|