有點激動,WPF換膚搞定了!


一如既往沒廢話!

wpf桌面應用開發都是window內引入很多個UserControl。

如果你有通過不同顏色來換膚的需求,那么下面我就將整個過程!

分2個步驟:

1.主窗體背景色替換;

2.同時界面內部部分控件(如:Button)也同步換色;

那么下面開始編碼:

window窗體背景色切換:

如圖,是一個Button群,每個按鈕都代表一個顏色

對應的代碼:

<Button Grid.Row="0" Grid.Column="0" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="QingLv" Background="#FF5CB021" ToolTip="青綠色"></Button>
<Button Grid.Row="0" Grid.Column="1" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="QianLan" Background="#FF447DCF" ToolTip="淺藍色"></Button>
<Button Grid.Row="0" Grid.Column="2" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="Cheng" Background="#FFE89949" ToolTip="橙色"></Button>
<Button Grid.Row="0" Grid.Column="3" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="QianZi" Background="#FF9560C9" ToolTip="淺紫色"></Button>
<Button Grid.Row="1" Grid.Column="0" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="FenZi" Background="#FFDA67CB" ToolTip="粉紫色"></Button>
<Button Grid.Row="1" Grid.Column="1" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="QianHe" Background="#FFA6620F" ToolTip="淺褐色"></Button>
<Button Grid.Row="1" Grid.Column="2" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="ShenLv" Background="#FF1F610C" ToolTip="深綠色"></Button>
<Button Grid.Row="1" Grid.Column="3" Width="20" Height="20" Style="{StaticResource MyButton}" Click="Button_Click" Tag="ZiLan" Background="#FF5A31A2" ToolTip="紫藍色"></Button>

個別屬性忽略別看,有用的只有Tag和Click

再看看Click里面是什么鬼?

        /// <summary>
        /// 背景色替換
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var btn = e.OriginalSource as Button;
                var btnTag = btn.Tag.ToString();//獲取到顏色按鈕Tag值,因為要用到2次,第一次window窗體背景色取值,第二次頁面控件獲取樣式
                ResourceD(btnTag);
                var bg = (SolidColorBrush)FindResource(btnTag);//獲取字典資源Key【X1.有講解】
                WindowForPages.Background = bg;//WindowForPages是Window的Name
                var model = new ThemeColor
                {
                    Id = LabelForThemeColorId.Content.ToString(),
                    Colors = btnTag
                };
                new ThemeColorBll().UpdateThemeColor(model);
            }
            catch { }
        }
        /// <summary>
        /// 更新替換樣式
        /// </summary> 
        /// <param name="bgName"></param> 
        private void ResourceD(string bgName)
        {
            var skinDictUri = new Uri("./Style/XX/" + bgName + ".xaml", UriKind.Relative);//【X2.提供樣式樣本】 
            var skinDict = Application.LoadComponent(skinDictUri) as ResourceDictionary;
            var mergedDicts = Resources.MergedDictionaries;
            mergedDicts.Clear();//清空之前樣式
            mergedDicts.Add(skinDict);//添加當前需要的樣式 
        } 

 

上面備注寫清楚了,養成看備注的習慣~~

【X1.有講解】看這里。當獲取到Tag=QingLv 的時候,系統會去樣式文件找對應的Key看下圖

此時,看到Color="{DynamicResource QingLvColor}" ,別急。為了代碼干凈,不雜亂,我分開2個文件寫了,對應的QingLvColor 在這里

此時,Window背景色開始改變了,贊。為了開始運行程序能有最后一次選擇的背景色效果,建議加上數據庫存儲或者其它存儲,只需要存儲上面Tag內部的值就行了,就這么簡單!

看看【X2.提供樣式樣本】 怎么玩?

同樣 private void ResourceD(string bgName) 方法就是玩這個的,只要把Tag值傳進來,就能根據路徑獲取到名稱對於的文件進行樣式替換。

下面貼出一個文件

提一點,不管多少個文件都這樣吧Style 的x:Key 寫成一樣的,必須一致!!必須一致!!必須一致!!三遍

<Button  Name="DelButton" Opacity="1" Grid.Column="0" Width="80"  Height="32"  HorizontalAlignment="Right" Click="DelButton_Click"  Style="{DynamicResource StyleBtnSss}" Foreground="White">
                    <Button.Template>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border BorderThickness="0" CornerRadius="18" Background="{TemplateBinding Button.Background}">
                                <ContentPresenter Content="{DynamicResource Delete}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </Border>
                        </ControlTemplate>
                    </Button.Template>
                </Button>

就這樣按鈕直接調取。同理,加載顯示同步樣式需要存儲值,啟動的時候就能看到效果!

卧薪嘗膽飲咖啡~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM