http://blog.csdn.net/ljf5566/article/details/41598269
实现思路
用到的开源项目MahApps.Metro。具体使用请看官网文档。
主要代码
换肤弹窗
- <!--实现换肤-->
- <Popup x:Name="skinUI" Margin="0" PopupAnimation="Fade" PlacementTarget="{Binding ElementName=btnSkin}"
- StaysOpen="False" SnapsToDevicePixels="True" ClipToBounds="True" AllowsTransparency="True" Placement="Left" VerticalOffset="25">
- <Border x:Name="bdSkin" BorderBrush="{DynamicResource AccentColorBrush}" BorderThickness="1"
- CornerRadius="8" Height="170" Width="450">
- <WrapPanel x:Name="skinPanel"/>
- </Border>
- </Popup>
后台代码
- using MahApps.Metro;
- using MahApps.Metro.Controls;
- using System.Linq;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Media;
- namespace UITemplate
- {
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : MetroWindow
- {
- public MainWindow()
- {
- InitializeComponent();
- btnSkin.Click += (s, e) => skinUI.IsOpen = true;
- skinPanel.AddHandler(Button.ClickEvent, new RoutedEventHandler(ChangeSkin));
- InitSkins();
- }
- /// <summary>
- /// 初始化所有皮肤控件
- /// </summary>
- private void InitSkins()
- {
- var accents = ThemeManager.Accents;
- Style btnStyle = App.Current.FindResource("btnSkinStyle") as Style;
- foreach (var accent in accents)
- {
- //新建换肤按钮
- Button btnskin = new Button();
- btnskin.Style = btnStyle;
- btnskin.Name = accent.Name;
- SolidColorBrush scb = accent.Resources["AccentColorBrush"] as SolidColorBrush;
- btnskin.Background = scb;
- skinPanel.Children.Add(btnskin);
- }
- }
- /// <summary>
- /// 实现换肤
- /// </summary>
- private void ChangeSkin(object obj, RoutedEventArgs e)
- {
- if (e.OriginalSource is Button)
- {
- Accent accent = ThemeManager.GetAccent((e.OriginalSource as Button).Name);
- App.Current.Resources.MergedDictionaries.Last().Source = accent.Resources.Source;
- }
- }
- }
- }
效果图
源码下载:点击打开链接