C# WPF通過WindowChrome自定義窗體

概述

?在WPF界面開發中,系統默認的窗口比較丑,有時候想自定義窗體,比如微信的客戶端窗口這樣:使得左邊的一塊頂到最上端,如下圖所示:

51219c4d0d8e70aee152773d2e42e99e.png

這時候我們可以 WindowStyle="None",AllowsTransparency="True"去掉默認的窗體邊框,然后添加最小最大和關閉的按鈕,然后重寫相關的功能實現

<TextBlock?x:Name="lblTitle"?Text="自定義窗體"?Foreground="White"?FontSize="14"?Margin="10?0?0?0"?VerticalAlignment="Center"/><StackPanel Orientation="Horizontal" HorizontalAlignment="Right"><Button WindowChrome.IsHitTestVisibleInChrome="True" Name="button_MiniSize" Content="─" Style="{StaticResource btn_nap}" HorizontalAlignment="Right" Foreground="White" Margin="0 0 5 0" Height="30" Width="30"/><Button WindowChrome.IsHitTestVisibleInChrome="True" Name="button_MaxSize" Content="?" Style="{StaticResource btn_nap}" HorizontalAlignment="Right" Foreground="White" Margin="0 0 5 0" Height="30" Width="30"/><Button WindowChrome.IsHitTestVisibleInChrome="True" x:Name="btn_Close" Content="?" Style="{StaticResource btn_nap}" HorizontalAlignment="Right" Foreground="White" Margin="0 0 5 0" Height="30" Width="30"/></StackPanel>

但是這樣做的話,這就不貼近原生窗口體驗了,

-. 需要寫大量代碼實現Window本來的拖動、改變大小、最大化最小化等行為;

-. 各種其它細節的修改,比如:最大化會覆蓋任務欄等;

為了保持最大的原生的同時以少量代碼實現自定義窗體,我們使用WindowChrome去實現會更加便捷和優雅.

WindowChrome用法舉例

<Window x:Class="WpfApp13.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp13"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Background="{x:Null}" FontWeight="ExtraLight" ResizeMode="CanResize" WindowStartupLocation="CenterScreen"><Window.Style><Style TargetType="Window"><Setter Property="WindowChrome.WindowChrome"><Setter.Value><WindowChromeCornerRadius="0"CaptionHeight="30"GlassFrameThickness="-1"UseAeroCaptionButtons="True"NonClientFrameEdges="None"/></Setter.Value></Setter>
</Style></Window.Style><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Image Source="left1.png"   Stretch="Fill"/><Grid  Grid.Column="1" ><Grid.RowDefinitions><RowDefinition Height="40"/><RowDefinition Height="32"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid  Grid.Row="0" ><Menu Margin="2,8,200,0"  VerticalAlignment="Center" WindowChrome.IsHitTestVisibleInChrome="True" Background="Transparent"><MenuItem Header="C#技術交流⑥群(111)" FontSize="15" /></Menu></Grid><Grid Grid.Row="2"><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"FontSize="50"FontWeight="Bold"Foreground="blue"Text="呆萌氣質小可愛" /></Grid></Grid></Grid>
</Window>

運行結果:

a7d9a409056a78ed80411a57a0ba0c46.png

WindowChrome用法說明

UseAeroCaptionButtons:表示標題欄上的那三個默認按鈕是否可以命中,這里設置為true,如果要自己管理則設置為false。

GlassFrameThickness和ResizeBorderThickness:這兩個屬性用于控制邊框,及用戶可以單擊并拖動以調整窗口大小的區域的寬度;其中GlassFrameThickness用來設置距離區域的厚度,設置為-1,可以使得區域覆蓋整個界面;ResizeBorderThickness可以設置窗口縮放的邊框厚度,不宜設置過大。

CaptionHeight:指定WindowChrome的標題欄高度;我這里設置的是30。設置為0表示界面無法響應鼠標的任何操作(拖動窗口, 雙擊標題欄的最大化最小化。。。僅僅是行為區域,并不影響外觀)。

NonClientFrameEdges:即指定哪一邊不屬于客戶區。用法舉例:

<WindowChrome.WindowChrome><WindowChrome NonClientFrameEdges="Left,Bottom,Right" />
</WindowChrome.WindowChrome>

要使用WindowChrome,最簡潔語法如下:

<WindowChrome.WindowChrome><WindowChrome /></WindowChrome.WindowChrome>

然后得到的窗體擁有默認窗口的所有窗口行為,

此外需要注意的是,如果元素在CaptionHeight的高度內,是無法響應鼠標事件的,此時需要給元素設置屬性WindowChrome.IsHitTestVisibleInChrome="True",很常見的問題,在自定義標題按鈕的時候,會發現自己點擊不了標題按鈕!

源碼下載

鏈接:https://pan.baidu.com/s/1ilUXW3JzrCLQX2xFINmByw

提取碼:6666

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【轉載】遞推公式的特征方程及通項公式

先貼上鏈接&#xff1a;http://blog.csdn.net/happykocola/article/details/73933314 因為最近在復習初賽&#xff0c;然后碰到了這道題&#xff0c;并不會做&#xff0c;才發現有這么高明的方法... 已知遞推關系式&#xff1a; f(n)5f(n-1)-6f(n-2) (n>1) f(0)1 f(1)…

【leetcode】75. Sort Colors

題目如下&#xff1a; 解題思路&#xff1a;我的解題思路是遍歷數組&#xff0c;遇到0刪除該元素并插入到數組頭部&#xff0c;遇到1則不處理&#xff0c;遇到2刪除該元素并插入到數組尾部。 代碼如下&#xff1a; class Solution(object):def sortColors(self, nums):"&q…

每日一言學做人,古之學問,博大精深

前言&#xff1a; 要成為一個有格局&#xff0c;有修養的人&#xff0c;吸納一些有道理的思想和做法&#xff0c;去逐漸提高自己是非常有必要的&#xff0c;有一言&#xff0c;做事先做人&#xff0c;意即于此。因此&#xff0c;每日將自己看到的一段有感的話記錄下來&#xf…

Seal-Report: 開放式數據庫報表工具

Seal Report是.Net的一個基于Apache 2.0 開源工具&#xff0c;完全用C# 語言編寫&#xff0c;最新的6.6 版本采用.NET 6&#xff0c;github: https://github.com/ariacom/Seal-Report。Seal Report提供了一個完整的框架&#xff0c;用于從任何數據庫或任何非SQL源生成每日報告。…

《Ceph源碼分析》——第2章,第2節Buffer

本節書摘來自華章出版社《Ceph源碼分析》一書中的第2章&#xff0c;第2.2節Buffer&#xff0c;作者常濤&#xff0c;更多章節內容可以訪問云棲社區“華章計算機”公眾號查看 2.2 BufferBuffer就是一個命名空間&#xff0c;在這個命名空間下定義了Buffer相關的數據結構, 這些數…

eclipse在server中tomcat server找不到的問題

想要在eclipse的server新建tomcat服務器然而不知道怎么回事找不到Tomcat 7.0 Server 下面的紅圈是tomcat server服務器&#xff08;更新后才出現&#xff09; 網上找的很久&#xff0c;只是找到在eclipse中安裝tomcat插件的方法 Tomcat免安裝版的環境變量配置以及Eclipse下的To…

Sysbench 1.0.15安裝及使用

Sysbench是一款開源的多線程性能測試工具&#xff0c;可以執行CPU/內存/線程/IO/數據庫等方面的性能測試&#xff0c;數據庫目前支持MySQL/Oracle/PostgreSQL。 一、安裝&#xff1a; Github地址&#xff1a;https://github.com/akopytov/sysbench RHEL/CentOS&#xff1a; cur…

PHP根據指定url生成二維碼圖片

一、composer安裝 http://packagist.p2hp.com/packages/codeitnowin/barcode 二、使用 調用generateQrCode()方法即可實現生成二維碼圖片并輸出下載給用戶 <?php namespace manage\Test;use CodeItNow\BarcodeBundle\Utils\QrCode; use common\extensions\Helper; use y…

CA 周記 - 派福利!通過 Azure 零成本進入 CUDA 編程

我們在配置深度學習環境的時候&#xff0c;除了安裝各種庫和框架外&#xff0c;如果需要 GPU 加速&#xff0c;還需要配置 CUDA 。那 CUDA 是什么 &#xff1f;它的作用是什么 &#xff1f;CUDA 編程介紹01什么是 CUDA&#xff1f;CUDA (Compute Unified Device Architecture) …

《視圖更新與關系數據庫理論》——2.1 關系和關系變量

本節書摘來自異步社區出版社《視圖更新與關系數據庫理論》一書中的第2章&#xff0c;第2.1節&#xff0c;作者&#xff1a;【美】C.J. Date&#xff08;達特&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.1 關系和關系變量 每一個關系都有一…

盜取手機敏感信息,Android 6.0之上兼容

盜取手機敏感信息&#xff0c;Android 6.0之上兼容 項目介紹 盜取信息包含&#xff1a; 手機中所有照片手機中所有視頻手機中所有通訊錄手機中所有短信手機中所有通話記錄手機中所有安裝應用兼容Android 6.0及之上版本動態權限申請工具開放效果展示 1.照片信息 MaterialBean{mL…

再記一次Memory Leak分析

性能是優化出來的&#xff0c;不管是在上生產前&#xff0c;還是在上生產后。大部分性能在性能測試階段就能發現問題&#xff0c;但也有一些性能問題&#xff0c;結合生產的環境&#xff0c;生產數據才能表現出來&#xff0c;成為一個顯著的瓶頸。這次是生成pdf造成的內存泄露&…

PHP格式化全國省市區列表

一、代碼部分 /*** 獲取全國省市區列表&#xff08;格式化后&#xff09;*/public function getRegionList(){$data CoreRegion::find()->select([national_code, region_name, parent_id, region_level])->asArray()->all();$data $this->assembleRegionData($…

《C語言開發從入門到精通》一2.4 技術解惑

本節書摘來自異步社區《C語言開發從入門到精通》一書中的第2章&#xff0c;第2.4節&#xff0c;作者王長青 , 韓海玲&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.4 技術解惑 2.4.1 安裝Visual Studio的幾個常見問題 Visual Studio 2010容量巨大&…

POM思想__首頁頁面元素查找、功能點實現進行封裝

一、代碼如下 package www.gui.huohu.pom;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.sele…

061_Apex 異常捕捉

Trigger 中的錯誤處理 在 Trigger 中&#xff0c;我們可以為進行操作的數據進行驗證&#xff0c;類似于驗證規則。如果遇到不符合條件的數據&#xff0c;可以通過 addError() 函數來將錯誤顯示給用戶&#xff0c;并記錄日志。 在如下代碼中&#xff0c;當一個“業務機會”對象被…

從 C# 崩潰異常 中研究 頁堆 布局

一&#xff1a;背景 1.講故事最近遇到一位朋友的程序崩潰&#xff0c;發現崩潰點在富編輯器 msftedit 上&#xff0c;這個不是重點&#xff0c;重點在于發現他已經開啟了 頁堆 &#xff0c;看樣子是做了最后的掙扎。0:000> !analyze -v EXCEPTION_RECORD: (.exr -1) Except…

Win10筆記本不顯示wifi列表

一、問題描述 1、連接有線網絡時&#xff0c;只顯示連接到的有線網絡&#xff0c;而不顯示wifi列表 2、不連接有線網絡時&#xff0c;同樣不顯示wifi列表 二、解決方案 1、Win R 打開運行&#xff0c;并輸入services.msc 2、回車確定&#xff0c;找到WLAN AutoConfig項&…

《游戲大師Chris Crawford談互動敘事》一22.1 互動敘事前途無量

本節書摘來異步社區《游戲大師Chris Crawford談互動敘事》一書中的第22章&#xff0c;第22.1節&#xff0c;作者&#xff1a; 【美】Chris Crawford譯者&#xff1a; 方舟 責編&#xff1a; 陳冀康&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 22.1 互動…

交換兩個局部變量Integer的值

反射是很強大的&#xff0c;誰說的final修飾的就不能改變&#xff0c; 通過反射獲取成員變量&#xff0c;之后可以取消訪問修飾符&#xff0c;也就是說private的也可以訪問&#xff0c; 在修改常量&#xff08;final修飾的&#xff09;&#xff0c;之后就可以對其做任何操作了 …