C# WPF TabControl控件用法詳解

概述

? ? ?TabControl我之前有講過一節,內容詳見:C# WPF TabControl用法指南(精品),上節主要講解了tabcontrol控件的左右翻頁,以及頁面篩選,以及數據綁定等內容,這節內容繼續接續上節內容進行擴展講解,主要針對頁面刪除、增加以及對應的事件進行講解.

功能演示

1dbdeedb85cd81a1c9150b301cbf7d7d.gif

代碼實現

前臺XAML:

<UserControl x:Class="Caliburn.Micro.Hello.TabControlView"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:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"xmlns:local="clr-namespace:Caliburn.Micro.Hello"xmlns:cal="http://www.caliburnproject.org"mc:Ignorable="d"   d:DesignHeight="450" d:DesignWidth="800" ><Grid ><Grid.RowDefinitions><RowDefinition Height="35"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><StackPanel Grid.Row="0" Margin="2" Orientation="Horizontal" HorizontalAlignment="Right"><Label Content="跳轉到頁:" VerticalAlignment="Center" Margin="5"/><TextBox Text="{Binding PageIndex}"   VerticalAlignment="Center" Margin="5" MinWidth="50"/><dx:SimpleButton Content="跳轉" Name="Button_Click" Margin="5"/></StackPanel><dx:DXTabControl   Grid.Row="1"  SelectedIndex="{Binding SelectedIndex}"ItemsSource="{Binding ParamItems}" Margin="5"cal:Message.Attach="[Event TabAdding]=[DXTAB_TabAdding($source,$eventArgs)];[Event TabRemoved]=[DXTabControl_TabRemoved($source,$eventArgs)];[Event TabRemoving]=[DXTabControl_TabRemoving($source,$eventArgs)];[Event TabHiding]=[DXTabControl_TabHiding($source,$eventArgs)];" ><dx:DXTabControl.ItemHeaderTemplate><DataTemplate><StackPanel Orientation="Horizontal"><!--<Image Source="{Binding ImageLabel}"/>--><dxlc:LayoutItem Label="{Binding Header}"/></StackPanel></DataTemplate></dx:DXTabControl.ItemHeaderTemplate><dx:DXTabControl.ItemTemplate><DataTemplate><ContentControl  cal:View.Model="{Binding SubView}" /></DataTemplate></dx:DXTabControl.ItemTemplate><dx:DXTabControl.View><dx:TabControlScrollView AllowHideTabItems="True" AllowAnimation="True" NewButtonShowMode="InTabPanel" ShowHeaderMenu="True"AllowKeyboardNavigation="True" AllowScrollOnMouseWheel="True" RemoveTabItemsOnHiding="True" /></dx:DXTabControl.View></dx:DXTabControl><!--<dxg:GridControl ><dxg:GridControl.View><dxg:TableView AllowPaging="True"/></dxg:GridControl.View></dxg:GridControl>--></Grid>
</UserControl>

這里綁定了幾個事件:

cal:Message.Attach="[Event TabAdding]=[DXTAB_TabAdding($source,$eventArgs)];[Event TabRemoved]=[DXTabControl_TabRemoved($source,$eventArgs)];[Event TabRemoving]=[DXTabControl_TabRemoving($source,$eventArgs)];[Event TabHiding]=[DXTabControl_TabHiding($source,$eventArgs)];" >

TabAdding,是在頁面添加前觸發,TabRemoved:頁面移除完成后觸發;TabRemoving:頁面移除前觸發,TabHiding:頁面隱層前觸發.

需要注意的是需要觸發移除頁面事件,首先需要將屬性RemoveTabItemsOnHiding設置為true。

NewButtonShowMode這個屬性:是個枚舉量,設置的是添加頁面+按鈕的位置,詳解如下:

//// 摘要://     Lists values that specify where to show the New button.[Flags]public enum NewButtonShowMode{//// 摘要://     The New Button is not shown.NoWhere = 0,//// 摘要://     The New Button is shown in the Header Area.InHeaderArea = 1,//// 摘要://     The New Button is located inside the Tab Panel, next to tab item headers.InTabPanel = 2,//// 摘要://     The New Button is shown in the Tab Panel and Header Area simultaneously.InHeaderAreaAndTabPanel = 3}

后臺cs代碼:

using DevExpress.Xpf.Core;
using PropertyChanged;
using System.Collections.ObjectModel;
using System.Windows;namespace Caliburn.Micro.Hello
{[AddINotifyPropertyChangedInterface]public class TabControlViewModel : Screen, IViewModel{public ObservableCollection<ParamDTO> ParamItems { get; set; } = new ObservableCollection<ParamDTO>();public int SelectedIndex { get; set; }public int PageIndex { get; set; }public TabControlViewModel(){DisplayName = "TabControlTest";PageIndex = 3;ParamItems.Add(new ParamDTO() { Header = "1", SubView = new MemorandumViewModel() });ParamItems.Add(new ParamDTO() { Header = "2", SubView = new MemorandumViewModel() });ParamItems.Add(new ParamDTO() { Header = "3", SubView = new MemorandumViewModel() });ParamItems.Add(new ParamDTO() { Header = "4", SubView = new MemorandumViewModel() });}public void Button_Click(){SelectedIndex = PageIndex - 1;}public void DXTAB_TabAdding(object sender, TabControlTabAddingEventArgs e){int currentPageCount = ParamItems.Count;e.Item = new ParamDTO(){Header = $"{currentPageCount + 1}",SubView = new MemorandumViewModel()};}public void DXTabControl_TabRemoving(object sender, TabControlTabRemovingEventArgs e){}public void DXTabControl_TabRemoved(object sender, TabControlTabRemovedEventArgs e){for (int i = 0; i < ParamItems.Count; i++){ParamItems[i].Header = $"{i + 1}";}}public void DXTabControl_TabHiding(object sender, TabControlTabHidingEventArgs e){if (ParamItems.Count == 1){MessageBox.Show($"There must be at least one of ParamDTO pages", "Page Remove");e.Cancel = true;}else{var confirmResult = MessageBox.Show($"確定刪除頁面","警告",MessageBoxButton.YesNo);if (confirmResult == MessageBoxResult.Yes || confirmResult == MessageBoxResult.OK){//to do}else{e.Cancel = true;}}}}[AddINotifyPropertyChangedInterface]public class ParamDTO{/// <summary>/// 標題/// </summary>public string Header { get; set; }/// <summary>/// SubView/// </summary>public MemorandumViewModel SubView { get; set; }}}

這里在TabHiding的事件里面設置了彈窗確認,如果點了確認再刪除頁面,點擊了取消則不刪除,防止了用戶誤操作把頁面刪除.頁面刪除完成后在TabRemoved里面重新排布了頁面標題序號.

源碼下載:百度網盤

鏈接:https://pan.baidu.com/s/1LVLSb9PzOme9m0S5GSP6Ow?

提取碼:6666

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

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

相關文章

pixel 解鎖_如何在Google Pixel 4和Pixel 4 XL上禁用面部解鎖

pixel 解鎖Justin Duino賈斯汀杜伊諾(Justin Duino)Face Unlock is one of the Google Pixel 4 and Pixel 4 XL’s flagship features. But if the facial recognition is a form of biometric security you’re uncomfortable with, you can delete your face data right off …

【實戰】將多個不規則多級表頭的工作表合并為一個規范的一維表數據結果表...

最近在項目里&#xff0c;有個臨時的小需求&#xff0c;需要將一些行列交叉結構的表格進行匯總合并&#xff0c;轉換成規范的一維表數據結構進行后續的分析使用。從一開始想到的使用VBA拼接字符串方式&#xff0c;完成PowerQuery的M語言查詢字符串&#xff0c;然后轉換成使用插…

#if defined(__cplusplus)

由于C編譯器需要支持函數的重載&#xff0c;會改變函數的名稱&#xff0c;因此dll的導出函數通常是標準C定義的。這就使得C和C的互相調用變得很常見。但是有時可能又會直接用C來調用&#xff0c;不想重新寫代碼&#xff0c;讓標準C編寫的dll函數定義在C和C編譯器下都能編譯通過…

happiness[國家集訓隊2011(吳確)]

【試題來源】 2011中國國家集訓隊命題答辯【問題描述】 高一一班的座位表是個n*m的矩陣&#xff0c;經過一個學期的相處&#xff0c;每個同學和前后左右相鄰的同學互相成為了好朋友。這學期要分文理科了&#xff0c;每個同學對于選擇文科與理科有著自己的喜悅值&#xff0c;而一…

sketch怎么移動圖層_什么是Photoshop Express,Fix,Mix和Sketch移動應用程序?

sketch怎么移動圖層Adobe’s approach to mobile apps seems to be “The More, The Better”. Right now, there are five Photoshop branded apps available for iOS and Android. Adobe的移動應用程序方法似乎是“越多越好”。 目前&#xff0c;有五個適用于iOS和Android的P…

imessage_如何在iPhone和iPad上的iMessage組中提及某人

imessageKhamosh PathakKhamosh PathakSometimes, it’s difficult to get someone’s attention in a large iMessage group chat on your iPhone or iPad. However, if you mention that person specifically in a message, your friend will receive a notification about i…

點擊右側導航欄,實現iframe嵌入子頁面中div,滑動到最上面

2019獨角獸企業重金招聘Python工程師標準>>> // 點擊對應的nav里的li標簽,頁面就滾動到哪里 $(.title-list > li).click(function(event) {$(this).addClass(active).siblings().removeClass(active);//li標簽里面有a標簽,可以阻止到a標簽的默認行為event.preven…

wepack環境配置1之node的安裝

.向往已久的webpack終于配好了.. 1.要安裝webpack&#xff0c;首先需要安裝nodejs nodejs下載地址:https://nodejs.org/en/ 下載完成后,一步步安裝即可,我是安裝到D盤 新建一個nodejs的文件夾,裝到這個文件夾里面即可. 安裝完畢后檢查自己是否安裝成功.啟動cmd,然后輸入npm -v,…

【賞析】.NET跨平臺框架-Avalonia UI

這是Avalonia UI官方的一個Demo&#xff0c;站長對部分Nuget包進行了升級&#xff0c;網友【小飛機MLA】對Linux版本修復了字體Bug得以正常運行、演示&#xff1a;Windows 11&#xff1a;macOS 13&#xff1a;可安裝Rider&#xff08;EAP即要&#xff09;開發&#xff0c;站長一…

Kernel Newbies內核開發新手的資源

Jessica McKellar在Ksplice blog上的博客文章《Linux Device Drivers》如果你在寫一個操作系統&#xff0c;OSDev wiki是一個不錯的網站Kernel Newbies內核開發新手的資源

office自定義安裝選項_如何自定義Office 2013中功能區上的現有選項卡

office自定義安裝選項The Ribbon in Microsoft Office 2013 provides quick access to many features and options by default, but it can be further customized to fit the way you use it. You can add a custom tab to the ribbon or you can add commands to the existin…

Centos6.8 安裝spark-2.3.1 以及 scala-2.12.2

一、Spark概述 Spark 是一個用來實現快速而通用的集群計算的平臺。 在速度方面&#xff0c;Spark 擴展了廣泛使用的 MapReduce 計算模型&#xff0c;而且高效地支持更多計算模式&#xff0c;包括交互式查詢和流處理。 在處理大規模數據集時&#xff0c;速度是非常重要的。速…

聊一聊 WPF 程序的鍵盤是如何被竊聽的?

一&#xff1a;背景 1.講故事前幾天群里很熱鬧&#xff0c;看了下在爭論兩個問題&#xff1a;電腦里要不要裝殺毒軟件 ?應該裝什么殺毒軟件 ?不管殺毒軟件流氓不流氓&#xff0c;在如今病毒肆虐的當下互聯網&#xff0c;裝一個還是能幫我們攔截很多意想不到的東西&#xff0c…

httpclient 實現文件上傳中轉

開發功能&#xff1a; web前端提交上傳文件 —> a服務器接收 —> 轉發到b服務器進行文件處理 下面是簡單實現的代碼&#xff0c;具體細節優化根本自己的需求更改。 public String handleResponse(HttpServletRequest request, HttpServletResponse response)throws Unsup…

AngularJS $watch 性能殺手

雙向綁定是AngularJS核心概念之一&#xff0c;它給我們帶來了思維的轉變&#xff0c;不再是以DOM為驅動&#xff0c;而是以Model為核心&#xff0c;View中寫上聲明式標簽&#xff08;指令或{{}}&#xff09;,AngularJS會在后臺默默同步View到Model,并將Model的變化更新到View。…

ipad和iphone切圖_如何在iPhone和iPad上的Messages App中固定對話

ipad和iphone切圖Khamosh PathakKhamosh PathakBetween updates from your bank and group chats, the Messages app on your iPhone or iPad can be a mess. Use the pinned conversations feature introduced in iOS 14 and iPadOS 14 to access your favorite conversations…

這個WPF的企業級MES項目爆火,就是UI爭議大!

工業4.0時代&#xff0c;智能智造MES系統大行其道&#xff0c;然而基于.NET跨平臺的罕見&#xff01;這里有一套《.NET6WPF企業級MES實戰》教程&#xff0c;基于.NET6跨平臺開發&#xff0c;實現了MES多核心功能&#xff0c;尤其是開發框架完整&#xff0c;非常適合復用。這里分…

單調棧學習筆記

線性結構——單調棧①定義&#xff1a;棧內的元素&#xff0c;按照某種方式排序&#xff08;單調遞增或單調遞減&#xff09;如果新入棧的元素破壞了單調性&#xff0c;就彈出棧內元素&#xff0c;直到滿足單調性②優點&#xff1a;可以很方便地求出某個數左邊或者右邊第一個比…

《VMware Virtual SAN權威指南(原書第2版)》一1.5 什么是Virtual SAN

1.5 什么是Virtual SAN Virtual SAN是VMware推出的一種存儲解決方案&#xff0c;它的beta版本在2013年發布&#xff0c;2014年3月正式開放給公眾&#xff0c;并于2016年3月升級到6.2版。VSAN完全集成在vSphere中&#xff0c;它是一種基于對象的存儲系統&#xff0c;是虛擬機存…

js 控制超出字數顯示省略號

//多余顯示省略號 function wordlimit(cname, wordlength) {var cname document.getElementsByClassName(cname);for (var i 0; i < cname.length; i) {      var nowLength cname[i].innerHTML.length;if (nowLength > wordlength) {cname[i].innerHTML cname…