檢察院加強網(wǎng)站建設(shè)長沙優(yōu)化網(wǎng)站推廣
ProWindow是ArcGIS Pro SDK中的一個WPF控件,具有以下特點:
-
可擴展性:ProWindow提供了豐富的API和樣式,可以輕松地擴展和自定義ArcGIS Pro應(yīng)用程序的UI。
-
可定制性:ProWindow支持多種UI控件和布局方式,可以創(chuàng)建符合自己需求的UI。
-
易用性:ProWindow是一個標(biāo)準(zhǔn)的WPF控件,使用起來非常簡單。
總之,使用ProWindow可以輕松地為ArcGIS Pro應(yīng)用程序添加自定義的用戶界面元素,以增強應(yīng)用程序的功能和易用性。
下面以一個小例子演示ProWindow窗口,Label、Button、Combobox等WPF控件的簡單使用方法,同時復(fù)習(xí)一下圖層、字段基本操作等內(nèi)容。
一、要實現(xiàn)的功能
如上圖所示,創(chuàng)建一個ProWindow示例窗口,通過下拉框選擇要素圖層,或通過按鈕打開一個要素類,在第二個下拉框中列出該要素圖層的所有字段名,再通過點擊顯示字段值按鈕,在列表框中顯示該字段的所有字段值。
二、Pro Window窗口的創(chuàng)建和UI設(shè)計
1、Pro Window窗口
在解決方案中右鍵點添加——新建項,選擇:ArcGIS Pro ProWindow,如上圖所示。
創(chuàng)建后的新窗口如下,左上是主窗口,是設(shè)計的主體。中間是屬性欄,在這里可以手動編輯名稱、標(biāo)題、窗體大小、顯示文字等屬性。最右側(cè)是工具箱窗口,包含默認的所有WPF控件,可以左鍵直接拖動到主窗口界面,直接創(chuàng)建控件,很方便。
從工具箱直接拖動2個Label控件、2個Button控件、2個ComboBox控件和1個ListBox控件,擺好位置,如下圖:
擺控件的時候有一個技巧,就是鎖定距離,可以控制和窗口邊界或和其它控件的距離,這樣窗口被拉伸的時候,也能保持位置,不至于發(fā)現(xiàn)形變。
2、Label控件
Label控件很簡單,就是個標(biāo)簽,基本不會在它上面創(chuàng)建什么事件,只要注意標(biāo)簽文本內(nèi)容和字體就行了。
3、Button控件
Button控件主要功能一般就是配一個點擊事件,然后處理這個事件即可。如上面所示,在屬性欄的事件窗口下,有很多可用的事件,這里用到了Click事件,可以手動輸入事件名,再按下【Enter】鍵,就會在對應(yīng)的cs文件中添加一個對應(yīng)名的方法。當(dāng)然,你直接雙擊主窗口的控件,也會自動生成并命名事件。
4、ComboBox控件
ComboBox控件是一個下拉框列表,主要的2個屬性,【IsEditable】勾選后可以編輯,【Items】可以預(yù)先編輯好下拉框里的內(nèi)容。
它的主要事件是【DropDownOpened】,即點擊下拉框,展開列表時觸發(fā)的事件。
5、Listbox控件
Listbox是1個列表框,主要用來以列表的方式展示內(nèi)容。一般不涉及事件觸發(fā)。
三、功能實現(xiàn)流程
之前自動創(chuàng)建的事件代碼全部都在ProWindow1.xaml.cs中,通過事件名找到對應(yīng)的代碼塊。
1、通過下拉框選擇當(dāng)前地圖的要素圖層
//清除combox當(dāng)前的列表內(nèi)容combox_feature.Items.Clear();// 獲取當(dāng)前地圖var map = MapView.Active.Map;// 獲取地圖中所有要素圖層var list_layers = map.GetLayersAsFlattenedList().OfType<FeatureLayer>();foreach (var layer in list_layers){//將要素圖層加入comboxcombox_feature.Items.Add(layer);}
通過點擊下拉框按鈕,將當(dāng)前地圖中所有的要素圖層加入到下拉框列表中,即可選擇你要的要素圖層。
2、通過打開對話框選擇要素類
OpenItemDialog openDlg = new OpenItemDialog(){Title = "選擇一個要素", //打開對話框標(biāo)題MultiSelect = false, //是否可以多選Filter = ItemFilters.FeatureClasses_All, //類型篩選};//打開對話框bool? ok = openDlg.ShowDialog();//如果沒有選擇內(nèi)容,則返回if (!ok.HasValue || openDlg.Items.Count() == 0)return;//如果有選擇內(nèi)容,返回選擇的內(nèi)容var item = openDlg.Items.First();//將選擇的內(nèi)容置入comboxcombox_feature.Text = item.Path;
這是簡單的打開對話框選擇要素類,之前的系列文章已經(jīng)寫過了。
3、點擊字段名列表combox_field控件時,列出所有字段名?
// 清空combox_fieldcombox_field.Items.Clear();await QueuedTask.Run(async () =>{// 獲取所選圖層的所有字段var fields = layer.GetFieldDescriptions();foreach (var field in fields){await QueuedTask.Run(() =>{// 在UI線程上執(zhí)行添加item的操作Application.Current.Dispatcher.Invoke(() =>{// 將所有字段名添加到combox_field中combox_field.Items.Add(field.Name);});});}});
當(dāng)事件觸發(fā)時,通過layer.GetFieldDescriptions()方法獲取所有字段,并添加到combox_field的Items里,這樣下拉列表里就會列出所有的字段。
4、點擊按鈕,在列表框中顯示所有字段值
List<string> values = new List<string>(); // 打開要素圖層的表格var table = initLayer.GetTable();// 定位到屬性表的游標(biāo)using (var tableCursor = table.Search(null, false)){while (tableCursor.MoveNext()){// 獲取當(dāng)前記錄的值var row = tableCursor.Current;var currentValue = row[init_fieldname];// 將不重復(fù)的字段值加入listbox_fieldif (values.Contains(currentValue.ToString())){continue;}else{values.Add(currentValue.ToString());// 切換回 UI 線程上下文,將字段值添加到 ListBox 控件中Dispatcher.Invoke(() =>{listbox_field.Items.Add(currentValue.ToString());});}}}});
先創(chuàng)建一個空列表values,用來儲存字段值。
通過GetTable()方法獲取要素圖層的屬性表,再逐行搜索字段值,如果出現(xiàn)新的值,就存入values,并放到listbox_field的Items,即可顯示在列表框里了。
以上只列出幾個步驟的核心代碼,完整的可以看文章末尾放出的工程文件。我是ArcGIS Pro SDK和C#的初學(xué)者,代碼也僅僅是可運行,代碼質(zhì)量肯定是不好,特別是C#的多線程,差點沒把我搞暈,大伙湊和著看吧。
四、工程文件分享
?最后,放上工程文件的鏈接:
WPFProWindowhttps://pan.baidu.com/s/1zvyF03K008lBrspHhZ3lRw?pwd=kzuw
PS:可以直接點擊...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安裝。