【Win10 應用開發】自定義應用標題欄

Win 10 app對窗口標題欄的自定義包括兩個層面:一是只定義標題中各部分的顏色,如標題欄上文本的顏色、三個系統按鈕(最大化,最小化,關閉)的背景顏色等;另一層是把窗口的可視區域直接擴展到標題欄上,當然三個系統按鈕是保留的。也可以用某個UI元素來作為標題欄來呈現。

先看最簡單的一層,即設置標題欄各部分的顏色。

ApplicationView類表示當前應用程序視圖相關操作,它公開了一個TitleBar屬性,訪問該屬性可以獲取到一個ApplicationViewTitleBar實例,通過該ApplicationViewTitleBar實例的公共屬性,可以設置各部分的顏色。

其實這些屬性,你看它的名字就知道干嗎用的,這里老周只是簡單劃分一下。

BackgroundColor

ForegroundColor

標題欄的背景色和前景色。背景色是標題欄的顏色,前景色是標題欄上顯示的標題文本的顏色。

InactiveBackgroundColor

InactiveForegroundColor

當窗口處于非活動狀態時,標題欄的背景色與前景色。和上一行中的屬性相對,上一行中的屬性是窗口在活動狀態時的顏色。

ButtonBackgroundColor

ButtonForegroundColor

當窗口處于活動狀態時,右邊的三個按鈕的背景色和前景色。

ButtonInactiveBackgroundColor

ButtonInactiveForegroundColor

當窗口處于非活動狀態時,標題欄右邊的三個按鈕的顏色。

ButtonHoverBackgroundColor

ButtonHoverForegroundColor

當鼠標移到按鈕上時的顏色。

ButtonPressedBackgroundColor

ButtonPressedForegroundColor

當按鈕被按下時的顏色。

?

上表中的各屬性的含義,老周就不說了,弄個表格出來已經很厚道了,你懂的,老周最討厭把某個類的成員列表格的;老周也很討厭抄襲MSDN的書。

接下來,就有一個問題了。其實設置這些顏色的代碼不難寫,重點是這些自定義代碼該放到哪里。因為是自定義當前視圖的外觀的代碼,注意這些設置只能是當前視圖下的,如果你新建了新視圖,還要重新設置外觀。比較合理的位置是放到應用程序級別的代碼中。當然,如果你能保證某個頁面是應用程序的主頁面,也可以寫到頁面的代碼里。

App類有兩個地方可以寫,一個是App的構造函數內,經測試,此處發生異常。所以,也只有一處可用了,就是OnLaunch方法

下面給個例子,很是TNND簡單,代碼放在OnLaunch方法中。

            ApplicationView view = ApplicationView.GetForCurrentView();ApplicationViewTitleBar bar = view.TitleBar;bar.BackgroundColor = Colors.Green;bar.ForegroundColor = Colors.Yellow;bar.ButtonBackgroundColor = Colors.DarkGoldenrod;bar.ButtonForegroundColor = Colors.DarkBlue;bar.ButtonHoverBackgroundColor = Colors.LightYellow;bar.ButtonHoverForegroundColor = Colors.Pink;bar.ButtonPressedBackgroundColor = Colors.Orange;bar.ButtonPressedForegroundColor = Colors.Purple;

?是吧,很簡單,找到對應的屬性,拼命地賦值就行了。你沒有賦值的屬性就采用系統默認的顏色。

然后看看結果。

有一點,你可以注意到:當鼠標移到關閉按鈕上時,它的背景始終是紅色,無論你怎么改都一樣

?

好了,上面的例子完結,下面我們看看如何將應用程序的可視區域伸展到標題欄中。

同樣,在App類的OnLaunch方法中加入以下代碼:

            ApplicationView view = ApplicationView.GetForCurrentView();var bar = view.TitleBar;bar.ButtonBackgroundColor = Colors.Blue;bar.ButtonForegroundColor = Colors.White;bar.ButtonHoverBackgroundColor = Colors.SkyBlue;CoreApplicationView coreappview = CoreApplication.GetCurrentView();coreappview.TitleBar.ExtendViewIntoTitleBar = true;

通過CoreApplication.GetCurrentView靜態方法,可以得到表示當前視圖的CoreApplicationView實例,再通過以下語句,把ExtendViewIntoTitleBar設置為true,表示允許窗口的可視部分擴展到標題欄上。

            coreappview.TitleBar.ExtendViewIntoTitleBar = true;

?

得到效果如下圖所示:

?

大概有些時候,僅僅擴充到標題欄還不夠,可能希望自定義一下標題欄。上面的代碼已經允許可視區域擴展到標題欄,接下來我們只需要定義一下自定義標題欄的內容,然后通過Window類就可以自定義為標題欄了。

現在,我們設計一些主頁面的UI。

    <Grid Background="#FFD3CA94"><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition/></Grid.RowDefinitions><StackPanel Name="tbar" Background="#FF916A88" Orientation="Horizontal"><Button Background="Blue"><SymbolIcon Symbol="Back"/></Button><Button Background="Green"><SymbolIcon Symbol="Forward"/></Button><TextBlock Margin="16,0,0,0" VerticalAlignment="Center" Text="我的應用" Foreground="White" /></StackPanel><TextBlock Text="My App" FontSize="100" Grid.Row="1"/></Grid>


然后在頁面的代碼中,將StackPanel元素作為標題欄。

        public MainPage(){this.InitializeComponent();Window.Current.SetTitleBar(this.tbar);}


調用SetTitleBar方法可以將某個UI元素設置為標題欄的內容。

?

得到的結果如下:

?

?

好,扯完了,肚子餓了,開飯。

示例源碼下載

?

轉載于:https://www.cnblogs.com/tcjiaan/p/4783049.html

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

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

相關文章

學習筆記(59):Python實戰編程-Graphics

立即學習:https://edu.csdn.net/course/play/19711/343123?utm_sourceblogtoedu 1.graphics&#xff1a;圖形界面組件的繪制&#xff0c;利用的是坐標的定位來對各個組件進行相對地位置布局 2.graphics與thinkter的區別 1&#xff09;窗口的創建上&#xff1a; win graphics…

IIS6配置Asp.net MVC運行環境

Windows server 2003 IIS6 搭建Asp.net MVC運行環境 1、安裝.Net Framework4.0。 下載地址&#xff1a; http://www.microsoft.com/zh-cn/download/details.aspx?id17718 2、安裝WindowsServer2003-KB968930-x86-CHS.exe&#xff0c;PowerShell 2.0的補丁 下載地址&#xff1…

VIO-slam 系統構建

文章目錄 目錄 文章目錄 前言 一、VIO系統數據的獲取&#xff1a;圖像傳感器選型、IMU傳感器選型 二、建立linux系統ROS環境 三、如何讀取圖像數據 四、如何讀取IMU傳感器數據 五、標定圖像和IMU數據的外參、相機的內參 六、移植VINS-MONO或者VINS-FUSION&#xff1a;主要調試獲…

MySQL5.7多源復制的實驗

MySQL5.7多源復制的實驗 node1: 192.168.2.171 master1 node2: 192.168.2.172 slave node3: 192.168.2.170 master2 node2上執行&#xff1a; change master to master_host192.168.2.171, master_userrpl, master_passwordAbcd1234, master_port3306, master_log…

最優化課堂筆記04:非線性規劃(考點4-5例題)

目錄 4.1 多元函數的泰勒展開 4.2方向導數與梯度 4.2.1方向導數 n元函數在點沿特定方向的方向導數 4.2.2梯度 4.3二次函數及正定矩陣 4.4凸函數與凸規劃 4.4.1凸函數 4.4.2凸規劃 4.4無約束優化問題的極值條件 4.5約束優化問題的極值條件&#xff08;重點考點&#x…

k近鄰算法C++二維情況下的實現

k近鄰算法C二維實現 這是一個k近鄰算法的二維實現&#xff08;即K2的情況&#xff09;。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <cmath> u…

java——對象學習筆記

1.面向對象&#xff08;OOP&#xff09;的三大特性 對象的行為&#xff08;behavior&#xff09;&#xff1a;可以對對象施加哪些操作&#xff0c;或者可以對對象施加哪些方法。 對象的狀態&#xff08;state&#xff09;&#xff1a;當施加那些方法后&#xff0c;對象如何響應…

C++獲取一段算法程序耗時方法

1、添加頭文件庫#include <chrono> 2、代碼編寫 std::chrono::steady_clock::time_point t1 std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point t2 std::chrono::steady_clock::now(); std::chrono::duration<double> time_used12 st…

cisco 動態路由協議RIP筆記

動態路由協議RIP router(config)#router rip 啟動RIP進程 router(config-router)#network 1.0.0.0 宣告主網絡號 router(config-router)#version 2 使用版本v2 router(config-router)#no auto-summary 關閉路由匯總功能 本文轉自 meteor_hy 51CTO博客&#xff0c;原文鏈接&a…

EBS FORM開發問題總結

1&#xff0c;form是基于單表視圖建立的&#xff0c;沒有寫on-insert此類的觸發器。在視圖上加了個rownum列結果導致form上的列不能更新 據說此種情形下的form會判斷視圖上的列是否屬于基表&#xff0c;不屬于的話會導致整個塊不能更新。 2&#xff0c;在form界面上顯示行號 在…

Django 學習資源

相關的分享&#xff1a; 開發者頭條&#xff1a;http://toutiao.io/search?utf8%E2%9C%93&qdjango 極客頭條及Django資訊&#xff1a;http://www.csdn.net/tag/django/news 一些優秀的文章&#xff1a; Django 常用測試方法&#xff1a;https://messense.me/django-common…

orb-slam2在PC和ARM上運行

ORBSLAM2的編譯與運行 環境&#xff1a;Ubuntu16.04 ORBSLAM2 &#xff08;1&#xff09;安裝工具 sudo apt-get install cmake sudo apt-get install git sudo apt-get install gcc g (2) 安裝pangolin 安裝依賴項&#xff1a; sudo apt-get install libglew-dev sudo ap…

爛泥:智能DNS使用與配置

公司的業務現在已經擴展到海外&#xff0c;對外提供的統一接口都是通過域名來解析的&#xff0c;但是海外用戶訪問國內接口的話&#xff0c;你懂的&#xff0c;很慢的。為了提高域名解析的速度&#xff0c;打算使用智能DNS功能&#xff0c;來解決海外用戶域名解析慢的問題。 PS…

現代制造工程——考試復習01

第一部分 金屬切削原理 1.切削過程中工件上的加工表面分類 2.不同工藝的工件和刀具的相對關系 3.不同工藝的主運動和進給運動的方向 4.思考&#xff1a;主運動一般只有一個&#xff0c;但是進給運動一個也可以是多個 5.切削三要素&#xff08;必考&#xff09; 6.思考&#x…

C++,C++編程,Windows編程,MFC

編程  我們日常生活中接觸到的電子類產品中的應用都是由編程而來  為什么編程&#xff0c;偷懶  我們通過編程驅使&#xff08;指揮&#xff0c;命令&#xff09;的是電信號  為什么上面說編程是偷懶&#xff0c;電的發現&#xff0c;給人們帶來了便利&#xff0c;人們…

orb-slam2 代碼邏輯梳理

1、開發大型C系統&#xff0c;可以首先從頭文件開始&#xff1b;先把頭文件的各種接口定義好&#xff1b;含義定義好&#xff1b;實現的時候只管內部實現就行&#xff0c;不需要管理外部的邏輯交互 2、定義在類中的變量&#xff0c;可以在前面加個小標志&#xff0c;mcamerMati…

eclipse中java項目轉換為web項目

123456789101112經常在eclipse中導入web項目時&#xff0c;出現轉不了項目類型的問題&#xff0c;導入后就是一個java項目&#xff0c;有過很多次經歷&#xff0c;今天也有同事遇到類似問題&#xff0c;就把這個解決方法記下來吧&#xff0c;免得以后再到處去搜索。解決步驟&am…

讓執行程序引用特定目錄下的Dll

當寫一個軟件&#xff0c;特別是大型的軟件&#xff0c;經常會引用一些第三方的類庫&#xff0c;再加上一些自己的項目&#xff0c;如果這些Dll全都放在主目錄下的話&#xff0c;會顯得比較雜亂。我們希望將項目的類庫分類成文件夾存放&#xff0c;這樣才顯得比較整潔。 解決方…

Angularjs controller之間的通信

剛剛看了網上的一些關于控制器之間的通信&#xff1b;然后結合自己項目做了一些&#xff0c;這里主要做的是二個同級之間的controller通信。 Html&#xff1a; 1 <html>2 <script src"http://apps.bdimg.com/libs/angular.js/1.3.9/angular.min.js"><…