1. 程式人生 > >分享一個自己寫的WPF換膚窗體WPF.DazzleUI

分享一個自己寫的WPF換膚窗體WPF.DazzleUI

最近自己在自學WPF,看了網上很多前輩的WPF例子,覺得很炫,自己也有點衝動,就嘗試著寫了一下。

桌面程式嘛,要炫起來,當然首先得窗體先炫起來,所以就自己寫了一個可以換膚的WPF窗體基類。

不多說,先上圖:



怎麼樣,看起來效果還是不錯吧。

先發個demo的下載地址: 例子下載  http://pan.baidu.com/share/link?shareid=565013&uk=1108265080

其實,已開始看別人的東西,覺得很神奇,不過自己寫下來,覺得也沒那麼複雜。只不過由於,WPF引入了XAML,跟以前winform時代有很大差別,需要一個轉換過程。多寫寫程式碼就好了。

窗體基類程式碼

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                    xmlns:DazzleWPF="clr-namespace:WPF.DazzleUI.Controls" 
                    xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation/shell"
                    xmlns:converters="clr-namespace:WPF.DazzleUI.Converters">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/WPF.DazzleUI;component/Assets/ImageButton.xaml"/>
    </ResourceDictionary.MergedDictionaries>

    <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    <converters:ResizeModeToVisibilityConverter x:Key="ResizeModeToVisibilityConverter" />

    <Style TargetType="DazzleWPF:DazzleWindow">

        <Setter Property="Width" Value="800" />
        <Setter Property="Height" Value="640" />
        <Setter Property="MinWidth" Value="50" />
        <Setter Property="MinHeight" Value="50" />
        <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
        <Setter Property="UseLayoutRounding" Value="True" />
        <Setter Property="TextOptions.TextFormattingMode" Value="Display" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DazzleWPF:DazzleWindow">

                    <Grid Background="#ffffff">

                        <Border BorderBrush="#3399ff" BorderThickness="0">

                            <AdornerDecorator>
                                <Grid x:Name="LayoutRoot">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="36" />
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="15" />
                                    </Grid.RowDefinitions>

                                    <!-- header background -->
                                    <Rectangle x:Name="HeaderBackground" Grid.RowSpan="5" Height="196" 
                                               VerticalAlignment="Top"
                                               Visibility="{DynamicResource Color_ImageOrColor}">
                                        <Rectangle.Fill>
                                            <LinearGradientBrush StartPoint="0, 0" EndPoint="0, 1" Opacity=".1">
                                                <GradientStop Offset="0" Color="{DynamicResource DazzleUI_BackGroudColor}" />
                                                <GradientStop Offset=".3" Color="{DynamicResource DazzleUI_BackGroudColor}" />
                                                <GradientStop Offset="1" Color="Transparent" />
                                            </LinearGradientBrush>
                                        </Rectangle.Fill>
                                    </Rectangle>
                                    <Image Source="{DynamicResource DazzleUI_BackGroudImage}" Grid.RowSpan="5"  Stretch="UniformToFill" VerticalAlignment="Top"
                                           Visibility="{DynamicResource Image_ImageOrColor}">
                                        <Image.OpacityMask>
                                            <LinearGradientBrush StartPoint="0.5, 0" EndPoint="0.5, 1">
                                                <GradientStop Color="#FF000000" Offset="0"></GradientStop>
                                                <GradientStop Color="#33000000" Offset="0.5"></GradientStop>
                                                <GradientStop Color="#00000000" Offset="1"></GradientStop>
                                            </LinearGradientBrush>
                                        </Image.OpacityMask>
                                    </Image>
                                    <ContentPresenter Grid.Row="1" Grid.RowSpan="2"></ContentPresenter>

                                    <!-- window system buttons-->
                                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" 
                                                    Margin="0" shell:WindowChrome.IsHitTestVisibleInChrome="True" Height="20">

                                        <DazzleWPF:ImageButton Width="28" Height="20"  
                                                               Visibility="{Binding ResizeMode, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource ResizeModeToVisibilityConverter}, ConverterParameter=MinButton}" 
                                                   Command="{Binding Source={x:Static shell:SystemCommands.MinimizeWindowCommand}}"
                                                   NormalImage="/WPF.DazzleUI;component/Resources/btn_mini_normal.png" 
                                                   HoverImage="/WPF.DazzleUI;component/Resources/btn_mini_highlight.png"
                                                   PressedImage="/WPF.DazzleUI;component/Resources/btn_mini_down.png"
                                                   DisabledImage="/WPF.DazzleUI;component/Resources/btn_mini_normal.png"></DazzleWPF:ImageButton>
                                        <DazzleWPF:ImageButton x:Name="MaxButton" Width="28" Height="20" 
                                                               Visibility="{Binding ResizeMode, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource ResizeModeToVisibilityConverter}, ConverterParameter=MaxButton}"
                                                   Command="{Binding Source={x:Static shell:SystemCommands.MaximizeWindowCommand}}"
                                                   NormalImage="/WPF.DazzleUI;component/Resources/btn_max_normal.png" 
                                                   HoverImage="/WPF.DazzleUI;component/Resources/btn_max_highlight.png"
                                                   PressedImage="/WPF.DazzleUI;component/Resources/btn_max_down.png"
                                                   DisabledImage="/WPF.DazzleUI;component/Resources/btn_max_normal.png"></DazzleWPF:ImageButton>
                                        <DazzleWPF:ImageButton x:Name="RestoreButton" Width="28" Height="20"  Visibility="Collapsed"
                                                   Command="{Binding Source={x:Static shell:SystemCommands.RestoreWindowCommand}}"
                                                   NormalImage="/WPF.DazzleUI;component/Resources/btn_restore_normal.png" 
                                                   HoverImage="/WPF.DazzleUI;component/Resources/btn_restore_highlight.png"
                                                   PressedImage="/WPF.DazzleUI;component/Resources/btn_restore_down.png"
                                                   DisabledImage="/WPF.DazzleUI;component/Resources/btn_restore_normal.png"></DazzleWPF:ImageButton>
                                        <DazzleWPF:ImageButton Width="39" Height="20"  ImageSize="39"
                                                   Command="{Binding Source={x:Static shell:SystemCommands.CloseWindowCommand}}"
                                                   NormalImage="/WPF.DazzleUI;component/Resources/btn_close_normal.png" 
                                                   HoverImage="/WPF.DazzleUI;component/Resources/btn_close_highlight.png"
                                                   PressedImage="/WPF.DazzleUI;component/Resources/btn_close_down.png"
                                                   DisabledImage="/WPF.DazzleUI;component/Resources/btn_close_normal.png"></DazzleWPF:ImageButton>
                                    </StackPanel>


                                    <!-- resize grip -->
                                    <Grid Grid.Row="2" >
                                        <Path x:Name="ResizeGrip" Visibility="Collapsed" Width="12" Height="12" Margin="1" HorizontalAlignment="Right" 
                                                  Stroke="#333333"
                                                  StrokeThickness="1"
                                                  Stretch="None"
                                                  Data="F1 M1,10 L3,10 M5,10 L7,10 M9,10 L11,10 M2,9 L2,11 M6,9 L6,11 M10,9 L10,11 M5,6 L7,6 M9,6 L11,6 M6,5 L6,7 M10,5 L10,7 M9,2 L11,2 M10,1 L10,3" />
                                    </Grid>
                                </Grid>
                            </AdornerDecorator>

                        </Border>
                        <Border BorderBrush="#7fbfff" BorderThickness="1" 
                                    Visibility="{Binding !IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource BooleanToVisibilityConverter}}" />
                        <Border BorderBrush="#3399ff" BorderThickness="1" 
                                    Visibility="{Binding IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource BooleanToVisibilityConverter}}" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="WindowState" Value="Maximized">
                            <Setter TargetName="LayoutRoot" Property="Margin" Value="7" />
                        </Trigger>
                        <Trigger Property="DazzleWindowState" Value="Maximized">
                            <Setter TargetName="MaxButton" Property="Visibility" Value="Collapsed" />
                            <Setter TargetName="RestoreButton" Property="Visibility" Value="Visible" />
                            <Setter TargetName="LayoutRoot" Property="Margin" Value="7" />
                        </Trigger>
                        <Trigger Property="DazzleWindowState" Value="Normal">
                            <Setter TargetName="MaxButton" Property="Visibility" Value="Visible" />
                            <Setter TargetName="RestoreButton" Property="Visibility" Value="Collapsed" />
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="ResizeMode" Value="CanResizeWithGrip" />
                                <Condition Property="WindowState" Value="Normal" />
                            </MultiTrigger.Conditions>
                            <Setter TargetName="ResizeGrip" Property="Visibility" Value="Visible" />
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

            </Setter.Value>
        </Setter>

        <Setter Property="shell:WindowChrome.WindowChrome">
            <Setter.Value>
                <shell:WindowChrome CornerRadius="0" GlassFrameThickness="1" UseAeroCaptionButtons="False" />
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>


原始碼只貼出來了主窗體的,全部貼出來程式碼太多了,估計也不容易看懂,拷貝過去也不一定能執行。大家有想要原始碼,留個郵箱吧,我發給大家。

PS:給大家介紹一些文章、開源的框架,我的程式也是參考這麼前輩的寫出來的。

這個可是個好東西,我的程式碼基本是參考它來的。 這個很實用哦 WPF換膚系列文章

相關推薦

分享一個自己WPF窗體WPF.DazzleUI

最近自己在自學WPF,看了網上很多前輩的WPF例子,覺得很炫,自己也有點衝動,就嘗試著寫了一下。 桌面程式嘛,要炫起來,當然首先得窗體先炫起來,所以就自己寫了一個可以換膚的WPF窗體基類。 不多說,先上圖: 怎麼樣,看起來效果還是不錯吧。 先發個demo的下載地址: 例

分享一個自己的MVC EF 增刪改查 無重新整理分頁程式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

週末閒著無聊分享一個自己的帶呼吸效果的android水波紋自定義view

無圖無真相,廢話不多說先來看看最終效果: 用法: 1.匯入自定義屬性檔案(將這個檔案放在 res/values 下) attrs.xml <span style="font-size:18px;"><?xml version="1.0" encodi

分享一個自己的用python比對資料庫表資料的指令碼

最近在做一個數據庫異構複製的專案,客戶表示需要一個數據比對的工具,我就自己寫了一個異構資料庫的比對python指令碼.這個比對指令碼只能比對數量,不能比對具體的記錄.使用的sql語句也是最基礎的select count(*) 這種,沒有開併發所以對大表可能比對時間稍長. 基

分享一個自己的vue多語言插件smart-vue-i18n

https 實現 template contain 解析 前言 了解 pre prot 前言 目前有比較成熟的方案(vue-i18n)了解了下,並且實用了一下感覺對於我在使用的項目來說略顯臃腫,功能比較多,所以壓縮的會比較大,在移動端不太適合所以自己花一天時間擼了一個vu

分享一個自己的取中國農歷相關數據的類。包含:農歷年月日,生肖,星座,年齡,天幹,地支等方法

png chinese 1.2 ins Oday 當前 for alt tdi 分享一個自己寫的取中國農歷相關數據的類。包含:農歷年月日,生肖,星座,年齡,天幹,地支等方法。此類自己花了一上午的時間寫的,適用於像相親網等類似的網站 主要使用了微軟針對東亞地區的農歷類Chi

一個自己的MVC框架

xml文件 ast target 實現類 讀取 能說 位置 加載 -i   也有個一周沒有更新博客了,其實我沒有偷懶,因為之前一直在看Spring源碼,所以想著去寫一個類Spring的框架,也沒有給自己定什麽高的要求,簡單實現MVC、AOP、IOC等功能就行。現在這個框架基

一個自己的字串匹配函式...

v3.0  1層迴圈 function match(x,y){ for(var j=0,i=0;j<y.length;j++) { if(x[i]==y[j]) i++; if(i==x.length) retu

一個自己的抓包軟體,支援外掛化指令碼分析

市場上的抓包工具已經足夠多,輕量級的,重量級的都有,典型的wireshark,smartsniff等, 各有優缺點,PowerSniff是為程式設計師準備的一款抓包工具,目標是使協議解析外掛編寫更簡單。檔案格式完全相容wiareshark和tcpdump。 原理:捕獲到資料就呼叫預設定的指令碼,將資料的指

記錄一個自己的hiveUDAF

這是一個我自己參考網站寫的UDAF,期間各種bug,終於讓我跑通了,作用是輸入表字段名稱,輸出欄位的統計總行數,為空行數,以及top十條去重後的樣例資料,方法說明都有標註,以下是程式碼貼圖: package com.zh.hive; import net.sf.json.JSONObjec

分享一個的Python遠端命令和檔案(夾)傳輸類

最近在跟一個自動化釋出平臺的建設事項,其中 Linux 系統的遠端控制通道則由我獨立開發完成,其中涉及到了 Linux 系統遠端命令和檔案傳輸操作。 因為之前寫 Linux 系統密碼管理系統的時候,用的是 Paramiko 的 SSHClient。所以,我這次依然採用 Paramiko 來做實現,程式碼雖短

四川智匯藍圖分享一個如何好軟文的祕訣

前言:現在是一個網際網路的時代,通過網際網路帶來客戶的企業是越來越多了,身邊不少的朋友都在說;"現在投入的廣告費比以前多了好幾倍,結果效果卻不盡人意,這到底是怎麼了?問題出現在哪裡呢?"其實針對這個問題很簡單,現在做網際網路的企業越來越多了,那麼自然從網際網路上面有一個轉變,

一個自己的PHP模板引擎

'; $stringHtml .= 'Error information: '; $stringHtml .= ''; $stringHtml .= $content; $stringHtml .= ''; $stringHtml .= ' '; exit($stringHtml); } } ?>

WPF的DEVWPF自帶控制元件一起

     小弟最近採用WPF,想簡便的換膚,所以研究了一下!好了,廢話不多說。先上圖,上面ribbon是DEV控制元件 下面亂亂的全是WPF自帶控制元件哦。      換膚步驟如下:     1、兩個DLL ,DevExpress.DemoData.v13.1.Cor

利用Android原始碼編譯一個自己的Hello World模組

這應該是我的Android底層開發第二篇文章,在編譯Android原始碼成功的基礎上又進一步利用Android原始碼編譯成功了一個自己寫的hello world,算入門第二步了。1、在android 原始碼路徑下的development路徑下建立hello路徑;2、建立he

自己一個帶placeHolder的textView,分享給大家

#import <UIKit/UIKit.h> @interface PlaceHolderTextView : UITextView {     UILabel *placeHolder;//編輯區 } @property(retain, nonatomic)

如何一個自己的渣渣PHP框架

.com 5% www tps tle title blank ref php 原文鏈接:https://www.opqnext.com/2017/01/18/%E5%A6%82%E4%BD%95%E5%86%99%E4%B8%80%E4%B8%AA%E8%87%AA%E5

自己一個文字過長顯示省略號的函數

bsp aaa poi var cti 顯示 adf 函數 字符 function points(strin,num){ //strin表示目標字符,num表示在第幾個字符用省略號顯示   var Str = "",len = strin.length;   if(len

oracle 10G 沒有 PIVOT 函數怎麽辦,自己一個不久有了

name 行轉列 動態sql self. subst ger esc 10g 必須 眾所周知,靜態SQL的輸出結構必須也是靜態的。對於經典的行轉列問題,如果行數不定導致輸出的列數不定,標準的答案就是使用動態SQL, 到11G裏面則有XML結果的PIVOT。 但是 orac

C#.NET 程序員的福利,自己一個XML操作類,可實現像jquery一樣方便的xml操作,且不用專門去處理命名空間。

console region ignorecas node 處理 命名空間 void clone 一個 此工具是進入一家新公司之後實現的,主要是工作當中操作 xml 的時間太多,因為公司按任務計“工作量”,領導給我安排的時間遠遠不夠完善此工具【悲哀的