WPF自定義Window窗體樣式

来源:https://www.cnblogs.com/s0611163/archive/2018/11/21/9994529.html
-Advertisement-
Play Games

資源文件代碼: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ...


資源文件代碼:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- 窗體按鈕模板 -->
    <ControlTemplate x:Key="tmplWindowBtn" TargetType="{x:Type Button}">
        <Border x:Name="bd" Width="28" Height="18" Background="Transparent"  >
            <Grid>
                <Image x:Name="img" Stretch="Fill" Source="{TemplateBinding Tag}"  />
                <Border x:Name="bdMask" Opacity="0.3" Visibility="Collapsed" Background="#001122" Margin="1 0 1 1" CornerRadius="0 0 3 3"></Border>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter TargetName="bdMask" Property="Visibility" Value="Visible"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="true">
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    <!-- 窗體模板 -->
    <ControlTemplate x:Key="tmplWindowEx" TargetType="{x:Type Window}">
        <Border>
            <Border CornerRadius="5" Background="#0998B8" Margin="{Binding BorderMargin}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="26"></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <TextBlock Text="{TemplateBinding Title}" Margin="10 0 0 0" FontFamily="微軟雅黑,黑體" FontSize="12" Foreground="#fff" VerticalAlignment="Center"></TextBlock>
                    <StackPanel Orientation="Horizontal" Background="#0998B8" HorizontalAlignment="{Binding BtnPanelHorizontalAlignment}" Width="100" Margin="88 0 0 0">
                        <StackPanel Orientation="Horizontal" Margin="10 0 5 0" VerticalAlignment="Top" HorizontalAlignment="Right">
                            <Button x:Name="btnMinimize" Template="{StaticResource tmplWindowBtn}" WindowChrome.IsHitTestVisibleInChrome="True" Command="{Binding DataContext.WindowBtnCommand, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="1" Visibility="{Binding BtnMinimizeVisibility}" >
                                <Button.Tag>
                                    <BitmapImage UriSource="/SunCreate.Common.Controls;Component/WindowEx/Images/btnWindowMin.png"/>
                                </Button.Tag>
                            </Button>
                            <Button x:Name="btnMaximize" Template="{StaticResource tmplWindowBtn}" WindowChrome.IsHitTestVisibleInChrome="True" Command="{Binding DataContext.WindowBtnCommand, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="2" Visibility="{Binding BtnMaximizeVisibility}" >
                                <Button.Tag>
                                    <BitmapImage UriSource="/SunCreate.Common.Controls;Component/WindowEx/Images/btnWindowMax.png"/>
                                </Button.Tag>
                            </Button>
                            <Button x:Name="btnClose" Template="{StaticResource tmplWindowBtn}" WindowChrome.IsHitTestVisibleInChrome="True" Command="{Binding DataContext.WindowBtnCommand, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="3">
                                <Button.Tag>
                                    <BitmapImage UriSource="/SunCreate.Common.Controls;Component/WindowEx/Images/btnWindowClose.png"/>
                                </Button.Tag>
                            </Button>
                        </StackPanel>
                    </StackPanel>
                    <Border Background="#d6e7f1" CornerRadius="3 0 3 3" Grid.Row="1" Margin="3" >
                        <ContentPresenter ></ContentPresenter>
                    </Border>
                </Grid>
            </Border>
        </Border>
    </ControlTemplate>
    <!-- 窗體樣式 -->
    <Style x:Key="stlWindowEx" TargetType="{x:Type Window}">
        <Setter Property="Template" Value="{StaticResource tmplWindowEx}"/>
        <Setter Property="AllowsTransparency" Value="True"></Setter>
        <Setter Property="Background" Value="Transparent"></Setter>
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="BorderBrush" Value="Transparent" />
        <Setter Property="ResizeMode" Value="NoResize" />
        <Setter Property="WindowStyle" Value="None" />
        <Setter Property="WindowChrome.WindowChrome">
            <Setter.Value>
                <WindowChrome CornerRadius="5 5 0 0"
                              CaptionHeight="35"
                              GlassFrameThickness="0"
                              UseAeroCaptionButtons="False"
                              NonClientFrameEdges="None">
                </WindowChrome>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
    
View Code

自定義窗體封裝WindowEx類代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Resources;

namespace SunCreate.Common.Controls
{
    /// <summary>
    /// 窗體封裝
    /// </summary>
    public class WindowEx : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private ICommand _WindowBtnCommand;
        /// <summary>
        /// 窗體按鈕命令
        /// </summary>
        public ICommand WindowBtnCommand
        {
            get
            {
                return _WindowBtnCommand;
            }
            set
            {
                _WindowBtnCommand = value;
                OnPropertyChanged("WindowBtnCommand");
            }
        }

        private Thickness _BorderMargin = new Thickness(0, 0, 0, 0);
        public Thickness BorderMargin
        {
            get
            {
                return _BorderMargin;
            }
            set
            {
                _BorderMargin = value;
                OnPropertyChanged("BorderMargin");
            }
        }

        private HorizontalAlignment _BtnPanelHorizontalAlignment = HorizontalAlignment.Right;
        /// <summary>
        /// 窗體按鈕的Panel位置
        /// </summary>
        public HorizontalAlignment BtnPanelHorizontalAlignment
        {
            get
            {
                return _BtnPanelHorizontalAlignment;
            }
            set
            {
                _BtnPanelHorizontalAlignment = value;
                OnPropertyChanged("BtnPanelHorizontalAlignment");
            }
        }

        private Visibility _BtnMinimizeVisibility = Visibility.Visible;
        /// <summary>
        /// 窗體最小化按鈕的顯示狀態
        /// </summary>
        public Visibility BtnMinimizeVisibility
        {
            get
            {
                return _BtnMinimizeVisibility;
            }
            set
            {
                _BtnMinimizeVisibility = value;
                OnPropertyChanged("BtnMinimizeVisibility");
            }
        }

        private Visibility _BtnMaximizeVisibility = Visibility.Visible;
        /// <summary>
        /// 窗體最大化按鈕的顯示狀態
        /// </summary>
        public Visibility BtnMaximizeVisibility
        {
            get
            {
                return _BtnMaximizeVisibility;
            }
            set
            {
                _BtnMaximizeVisibility = value;
                OnPropertyChanged("BtnMaximizeVisibility");
            }
        }

        /// <summary>
        /// 窗體 構造函數
        /// </summary>
        public WindowEx()
        {
            this.DataContext = this;
            this.ShowInTaskbar = false;

            #region 窗體樣式設置
            Uri uri = new Uri("/SunCreate.Common.Controls;Component/WindowEx/WindowExResource.xaml", UriKind.Relative);
            ResourceDictionary rd = new ResourceDictionary();
            rd.Source = uri;
            this.Style = rd["stlWindowEx"] as Style;
            #endregion

            #region 窗體按鈕事件
            WindowBtnCommand windowBtnCommand = new WindowBtnCommand();
            windowBtnCommand.DoAction = (parameter) =>
            {
                if (parameter == 1) //最小化
                {
                    this.BorderMargin = new Thickness(1, 0, 0, 0);
                    BtnPanelHorizontalAlignment = HorizontalAlignment.Left;
                    BtnMinimizeVisibility = Visibility.Collapsed;
                    this.WindowState = WindowState.Minimized;
                }
                if (parameter == 2) //視窗還原、最大化
                {
                    if (this.WindowState == WindowState.Normal)
                    {
                        double taskBarHeight = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Height;
                        double taskBarWidth = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Width;
                        if (taskBarWidth > 0)
                        {
                            this.BorderMargin = new Thickness(0, 0, taskBarWidth, 0);
                        }
                        if (taskBarHeight > 0)
                        {
                            this.BorderMargin = new Thickness(0, 0, 0, taskBarHeight);
                        }
                        BtnPanelHorizontalAlignment = HorizontalAlignment.Right;
                        BtnMinimizeVisibility = Visibility.Visible;
                        this.WindowState = WindowState.Maximized;
                    }
                    else if (this.WindowState == WindowState.Maximized)
                    {
                        this.BorderMargin = new Thickness(0, 0, 0, 0);
                        BtnPanelHorizontalAlignment = HorizontalAlignment.Right;
                        BtnMinimizeVisibility = Visibility.Visible;
                        this.WindowState = WindowState.Normal;
                    }
                    else if (this.WindowState == WindowState.Minimized)
                    {
                        this.BorderMargin = new Thickness(0, 0, 0, 0);
                        BtnPanelHorizontalAlignment = HorizontalAlignment.Right;
                        BtnMinimizeVisibility = Visibility.Visible;
                        this.WindowState = WindowState.Normal;
                    }
                }
                if (parameter == 3) //關閉視窗
                {
                    this.Close();
                }
            };
            this.WindowBtnCommand = windowBtnCommand;
            this.StateChanged += (s, e) =>
            {
                if (this.WindowState == WindowState.Maximized)
                {
                    BtnPanelHorizontalAlignment = HorizontalAlignment.Right;
                    BtnMinimizeVisibility = Visibility.Visible;
                    double taskBarHeight = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Height;
                    double taskBarWidth = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Width;
                    if (taskBarWidth > 0)
                    {
                        this.BorderMargin = new Thickness(0, 0, taskBarWidth, 0);
                    }
                    if (taskBarHeight > 0)
                    {
                        this.BorderMargin = new Thickness(0, 0, 0, taskBarHeight);
                    }
                }
                if (this.WindowState == WindowState.Normal)
                {
                    this.BorderMargin = new Thickness(0, 0, 0, 0);
                    BtnPanelHorizontalAlignment = HorizontalAlignment.Right;
                    BtnMinimizeVisibility = Visibility.Visible;
                }
            };
            #endregion

        }

        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}
View Code

窗體最小化、最大化、關閉按鈕的命令WindowBtnCommand:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace SunCreate.Common.Controls
{
    public class WindowBtnCommand : ICommand
    {
        public Action<int> DoAction { get; set; }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            if (DoAction != null)
            {
                DoAction(Convert.ToInt32(parameter));
            }
        }
    }
}
View Code

使用WindowEx類的示例代碼:

<ui:WindowEx x:Class="SunCreate.Common.Controls.Demo.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ui="clr-namespace:SunCreate.Common.Controls;assembly=SunCreate.Common.Controls"
        Title="視頻播放視頻播放ABCDEFG" Height="300" Width="500" WindowStartupLocation="CenterScreen"
        BtnMinimizeVisibility="Visible" BtnMaximizeVisibility="Visible" >
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/SunCreate.Common.Controls;Component/Themes/ScrollViewer.xaml"/>
                <ResourceDictionary Source="/SunCreate.Common.Controls;Component/Themes/ControlsResource.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Border Margin="10">
                <Button Height="30" Width="80" Content="測試" Style="{StaticResource stlTxtBtn}" HorizontalAlignment="Left" Click="Button_Click" />
            </Border>
            <Border Margin="10">
                <TextBlock Text="測試內容ABC"></TextBlock>
            </Border>
        </StackPanel>
    </Grid>
</ui:WindowEx>
View Code

效果圖:

窗體最小化效果圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 委托(Delegate) 是存有對某個方法的引用的一種引用類型變數 委托特別用於實現事件和回調方法。所有的委托都派生自 System.Delegate 類 委托是一個類,麽它就可以被定義在任何地方,即可以定義在類的內部,也可以定義在類的外部 委托是一種類型安全的函數回調機制, 不僅能夠調用實例 ...
  • 項目中需要能夠查詢門禁信號和控制門禁設備,因此需要基於大華門禁SDK進行二次開發,開發語言C#。門禁開發中遇到了一些問題,經過與大華技術的郵件溝通也一一解決。做這個開發的時候,發現網上的資料比較少,想著把自己遇到的問題整理下來,讓有需要的人儘量少走一些彎路。 ...
  • 1.首先從NuGet中安裝Quartz,安裝最新版本就OK 2.新建一個Job類實現Quart中的IJob介面用於執行業務邏輯,代碼如下: 3.新建一個任務執行類用於啟動任務,代碼如下: 對於標黃色部分做簡單說明 CheckUpdateJob:毫無疑問就是你的Job類。從源碼裡面看必須是需要實現IJ ...
  • 1. 註冊表中,IE的位置: 電腦\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer 2. 通過註冊表讀取IE配置 3. 讀取IE的版本號 4. 獲取主版本號(8/9/10 etc.) ...
  • CLR 無法從 COM 上下文 0x197bf0 轉換為 COM 上下文 0x197a80,這種狀態已持續 60 秒。擁有目標上下文/單元的線程很有可能執行的是非泵式等待或者在不發送 Windows 消息的情況下處理一個運行時間非常長的操作。這種情況通常會影響到性能,甚至可能導致應用程式不響應或者使 ...
  • 概述 本篇文章將介紹C# 在PPT幻燈片中操作形狀(shape)的方法。這裡主要涉及常規形狀,如箭頭、矩形、圓形、三角形、多邊形、不規則形狀等。下麵的示例中,可以通過繪製形狀,並設置相應格式等。示例包含以下要點: 繪製形狀 用圖片填充形狀 在形狀中添加文字 設置形狀單色、漸變色填充 設置形狀陰影效果 ...
  • 因為之前寫RDLC 列印用的直接列印,複製網上的方法,列印出來以後會在根目錄下生成 一個EMF文件類型的文件,每次手動刪又很麻煩,所以做了一個控制台控制放在任務計劃裡面每天刪除emf文件。 既然要刪除指定文件 不可避免的要遍歷文件夾下的所有文件 1.首先要聲明文件目錄 2.聲明一個Directory ...
  • WPF自定義TabControl,TabControl美化 XAML代碼: <TabControl x:Class="SunCreate.Common.Controls.TabControlEx" xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...