【ArcGIS Pro二次開發】(83):ProWindow和WPF的一些技巧

在ArcGIS Pro二次開發中,SDK提供了一種工具界面【ArcGIS Pro ProWindow】。

關于ProWindow的用法,之前寫過一篇基礎的教程:

【ArcGIS Pro二次開發】(13):ProWindow的用法_arcgispro二次開發教程-CSDN博客

主要是對幾個常用控件的簡單使用進行介紹。

這一篇通過ProWindow講一些WPF的技巧。


一、要實現的效果

?

要實現的效果比較簡單,就是一個帶圖標的幫助鍵。

看著比較容易,但這里是想通過這個例子講一下WPF的實現邏輯和樣式定制,做的過程中感覺很有意思,就記錄下來。


二、實現流程

首先在解決方案中右鍵點【添加】——【新建項】,選擇【ArcGIS Pro ProWindow】,如下圖所示:

從工具箱拖1個Button控件到主界面中,樣式是系統默認的,比較丑:

修改樣式。在下方的XAML界面中找到Button的代碼,直接修改:

在屬性行中修改邊框(BorderBrush),背景色(Background):

    <Grid><Button Content="Button" BorderBrush="#FF81BAF9" Background="White" HorizontalAlignment="Left" Margin="120,0,0,0" VerticalAlignment="Center"/></Grid>

修改圓角的話就比較麻煩一點,需要修改Template,邊框,背景色等屬性也要在Template中重寫:

    <Grid><Button Content="Button" HorizontalAlignment="Left" Margin="120,0,0,0" VerticalAlignment="Center"><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Border BorderThickness="1" BorderBrush="#FF81BAF9" CornerRadius="2" Background="White"><ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/></Border></ControlTemplate></Button.Template></Button></Grid>

效果如下:

對比最開始給的效果圖,按鈕內部有一個圖片和一個文本,顯示這不是用屬性可以直接設置的,而是在內容放了2個控件【Image和TextBlock】。2個控件水平排列,就再加個StackPanel:

    <Grid><Button HorizontalAlignment="Center" VerticalAlignment="Center" Height="23" Width="70"><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><Image Source="/CCTool;component/Data/Icons/help.png" Height="16"/><TextBlock Text="幫助"  Margin="8,0,0,0" VerticalAlignment="Center"/></StackPanel><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Border BorderThickness="1" BorderBrush="#FF81BAF9" CornerRadius="2" Background="White"><ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/></Border></ControlTemplate></Button.Template></Button></Grid>

需要注意這里Image的源圖片,需要設置生成操作為【資源】,如果是英文版的話,就是【Resource】,不然是不會正常顯示的。

生成結果如下:

至此已經實現了我們想要達到的效果。


三、樣式【Style】的妙用

如果只是實現上面的效果,并不值得專門寫一篇文,本文最主要的是想說一下樣式的用法。

如果每一個按鈕都要寫上面一大段代碼實在很繁瑣,這時候樣式【Style】就顯得很有用了。

首先把Grid上方那塊Resources代碼刪掉:

然后在這個位置輸入Window.Resources,里面放Style,給它個key【btn_xx】,名字隨意,主要是將來控件調用的時候會用到。

把剛才寫的那段內容給放在Style里,不過需要注意幾個控件的內容要用【Grid】給包起來:

    <Window.Resources><Style x:Key="btn_xx" TargetType="{x:Type Button}"><Setter Property="Background" Value="White"/><Setter Property="BorderBrush" Value="#FF81BAF9"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Button}"><Grid><Border x:Name="border" CornerRadius="2" Background="White" BorderBrush="#FF81BAF9" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true"><ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/></Border><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><Image Source="/CCTool;component/Data/Icons/help.png" Height="16"/><TextBlock Text="幫助"  Margin="8,0,0,0" VerticalAlignment="Center"/></StackPanel></Grid></ControlTemplate></Setter.Value></Setter></Style></Window.Resources>

然后button在調用的時候,就不用寫那么多代碼了,一行就夠:

    <Grid><Button Style="{StaticResource btn_xx}" Height="24" Width="70"/></Grid>

這里就加了一個Style=,調用剛才寫的Style的key即可。

實現的效果不變,下次再添加按鈕就方便多了:

到這里還沒有完,雖然Style被提取出去,簡化了很多,但還有更好的解決思路,就是【資源詞典】。

在項目中添加一個【資源詞典(WPF)】:

然后也不用重新寫那一大段,可以在資源詞典中直接生成。

但是首先,要先把剛才寫的那一大段【樣式】刪除,改成這樣一段:

    <controls:ProWindow.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="/CCTool;component/WpfStyle.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></controls:ProWindow.Resources>

是中間一行引用的就是剛才新建的資源詞典,注意路徑,我的是新建在根目錄下,所以component后面直接跟著WpfStyle.xaml。

然后拖一個button控件過來,右鍵點擊【編輯模板】—【編輯副本】:

定義位置到剛才新建的資源字典中:

這時候再打開WpfStyle.xaml就會發現里面多了一長串代碼:

注意這里的這個【x:Key = ButtonStyle】就是剛剛生成的樣式。

下面就是一個很完整的樣式,可以在這里面隨意更改,修改好后,同樣的在button里調用Style="{StaticResource ButtonStyle}"即可。

資源字典的好處是可以跨項目使用。自己積累下來的樣式,可以在以后的項目中調用,而不局限于當前項目,因此是很有用的。

樣式還有一些其它有意思的內容,如繼承等,等后面研究透了再來吧。

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

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

相關文章

異步編程實戰之webflux

一, 快速搭建webflux項目 1, 引入相關依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.5</version><relativePath/> <!-- lookup parent fr…

【嵌入式實踐】【芝麻】【設計篇-2】從0到1給電動車添加指紋鎖:項目可行性分析

0. 前言 該項目是基于stm32F103和指紋模塊做了一個通過指紋鎖控制電動車的小工具。支持添加指紋、刪除指紋&#xff0c;電動車進入P檔等待時計時&#xff0c;計時超過5min則自動鎖車&#xff0c;計時過程中按剎車可中斷P檔狀態&#xff0c;同時中斷鎖車計時。改項目我稱之為“芝…

EMR StarRocks實戰——猿輔導的OLAP演進之路

目錄 一、數據需求產生 二、OLAP選型 2.1 需求 2.2 調研 2.3 對比 三、StarRocks的優勢 四、業務場景和技術方案 4.1 整體的數據架構 4.2 BI自助/報表/多維分析 4.3 實時事件分析 4.5 直播教室引擎性能監控 4.4 B端業務后臺—斑馬 4.5 學校端數據產品—飛象星球 4…

Ajax(黑馬學習筆記)

Ajax介紹 Ajax概述 我們前端頁面中的數據&#xff0c;如下圖所示的表格中的學生信息&#xff0c;應該來自于后臺&#xff0c;那么我們的后臺和前端是互不影響的2個程序&#xff0c;那么我們前端應該如何從后臺獲取數據呢&#xff1f;因為是2個程序&#xff0c;所以必須涉及到…

【ACM】—藍橋杯大一暑期集訓Day3

&#x1f680;歡迎來到本文&#x1f680; &#x1f349;個人簡介&#xff1a;陳童學哦&#xff0c;目前學習C/C、算法、Python、Java等方向&#xff0c;一個正在慢慢前行的普通人。 &#x1f3c0;系列專欄&#xff1a;陳童學的日記 &#x1f4a1;其他專欄&#xff1a;CSTL&…

langchain學習筆記(九)

RunnableBranch: Dynamically route logic based on input | &#x1f99c;?&#x1f517; Langchain 基于輸入的動態路由邏輯&#xff0c;通過上一步的輸出選擇下一步操作&#xff0c;允許創建非確定性鏈。路由保證路由間的結構和連貫。 有以下兩種方法執行路由 1、通過Ru…

Unity引擎中光源都有哪幾種,都有什么作用

本文由 簡悅 SimpRead 轉碼&#xff0c; 原文地址 mp.weixin.qq.com Unity 引擎為了實現游戲場景的明暗和光影效果&#xff0c;提供了四種類型的光源&#xff0c;分別是方向光&#xff08;Directional Lights&#xff09;、點光源&#xff08;Point Lights&#xff09;、聚光燈…

Vue開發實例(一)Vue環境搭建第一個項目

Vue環境搭建&第一個項目 一、環境搭建二、安裝Vue腳手架三、創建Vue項目 一、環境搭建 下載方式從官網下載&#xff1a;http://nodejs.cn/download/ 建議下載v12.16.0版本以上的&#xff0c;因為版本低無法創建Vue的腳手架 檢驗是否安裝成功 配置環境變量 新增NODE_HOME&…

win11系統中nginx簡單的代理配置

一.背景 為了公司安排的師帶徒任務。 操作系統版本&#xff1a;win11家庭版 nginx版本&#xff1a;1.24.0 二.配置代理 之前文章已經說明了nginx簡單的安裝&#xff0c;要看閱讀這個文章哈。web服務器nginx下載及在win11的安裝-CSDN博客 1.配置需求識別 前端服務nginx(80…

【探索AI】十七 深度學習之第3周:卷積神經網絡(CNN)(一)-CNN的基本原理與結構

第3周&#xff1a;卷積神經網絡&#xff08;CNN&#xff09; CNN的基本原理與結構 常見的卷積層、池化層與全連接層 LeNet、AlexNet等經典CNN模型 實踐&#xff1a;使用CNN進行圖像分類任務 CNN的基本原理與結構 引言與背景介紹 卷積神經網絡&#xff08;CNN&#xff09;是…

雙周回顧#007 - 前端與后端

前端的問題不是難&#xff0c;而是它面對最終用戶。只要用戶的喜好和口味發生變化&#xff0c;前端就必須跟上。 這導致前端不得不快速變化&#xff0c;因為用戶的口味正在越來越快地改變。 后端不需要面對最終用戶&#xff0c;需要解決的都是一些經典的計算機科學問題&#…

什么是Vue指令?請列舉一些常見的Vue指令以及它們的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一種特殊屬性&#xff0c;用于在模板中對 DOM 元素進行直接操作。指令通常是以 v- 開頭的特殊屬性&#xff0c;用于響應式地將數據綁定到 DOM 元素上。 在 Vue 中&#xf…

C語言初階—函數(函數的聲明和定義,函數遞歸)

函數聲明&#xff1a; 1.告訴編譯器有一個函數叫什么&#xff0c;參數是什么&#xff0c;返回類型是什么&#xff0c;但是具體是不是存在&#xff0c;函數聲明決定不了。 2.函數的聲明一般出現在函數使用之前&#xff0c;要滿足先聲明后使用。 3.函數的聲明一般要放在頭文件中。…

Launch學習

參考博客&#xff1a; (1) 史上最全的launch的解析來啦&#xff0c;木有之一歐 1 ROS工作空間簡介 2 元功能包 src目錄下可以包含多個功能包&#xff0c;假設需要使用機器人導航模塊&#xff0c;但是這個模塊中包含著地圖、定位、路徑規劃等不同的功能包&#xff0c;它們的邏…

agent內存馬

搭建一個簡單的Servlet項目 ServletDemo package com.naihe;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;…

【探索AI】十一 深度學習之機器學習基礎

鑒于之前文章中提到的深度學習計劃&#xff0c;后續的文章會根據之前的接著繼續學習&#xff0c;python基礎略過&#xff0c;想學的同學請自學&#xff1a; python入門 python進階 機器學習基礎 機器學習是人工智能領域的一個子集&#xff0c;它專注于從數據中自動學習并提升…

vue2+若依框架plus交互 路由介紹

本周及寒假 參加了校企合作的工程過程管理&#xff0c;和學長學姐一起寫項目&#xff0c;之前學了vue也沒有應用&#xff0c;然后對框架很多組件的用法不太了解&#xff0c;前期耽誤了一些時間。 框架模塊 首先是框架模塊的介紹 api存了一些系統管理及發送請求的方法 例如p…

【python】`assert`斷言語句

assert是一個斷言語句&#xff0c;用于在代碼中檢查某個條件是否為真。 如果條件為假&#xff0c;將觸發AssertionError 異常&#xff0c;從而指示存在錯誤。

Linux獲取進程(系統啟動時間和運行時間)運行時間

Linux獲取進程運行時間 思路&#xff1a;使用 ps - o命令 ps -p 986 -o etime可以獲取進程986的執行時間&#xff0c;不論系統時間有沒有發生改變&#xff0c;它都可以返回正確的結果: 總結&#xff1a;etime 是真正的程序運行時間&#xff0c;而不是系統運行時間與進程啟動…

在您的下一個項目中選擇 Golang 和 Node.js 之間的抉擇

作為一名軟件開發者&#xff0c;我總是在尋找構建應用程序的最快、最高效的工具。在速度和處理復雜任務方面&#xff0c;我認為 Golang 和 Node.js 是頂尖技術。兩者在性能方面都享有極高的聲譽。但哪一個更快——Golang 還是 Node&#xff1f;我決定深入一些硬核基準測試&…