WPF自定義控制項創建

来源:https://www.cnblogs.com/kiba/archive/2019/01/23/10307486.html
-Advertisement-
Play Games

WPF自定義控制項創建 本文簡單的介紹一下WPF自定義控制項的開發。 首先,我們打開VisualStudio創建一個WPF自定義控制項庫,如下圖: 然後,我們可以看到創建的解決方案如下: 在解決方案中,我們看到了一個Themes文件夾和一個CS文件。 其中CS文件,就是我們需要編寫的自定義控制項,裡面的類繼 ...


WPF自定義控制項創建

本文簡單的介紹一下WPF自定義控制項的開發。

首先,我們打開VisualStudio創建一個WPF自定義控制項庫,如下圖:

然後,我們可以看到創建的解決方案如下:

在解決方案中,我們看到了一個Themes文件夾和一個CS文件。

其中CS文件,就是我們需要編寫的自定義控制項,裡面的類繼承了Control類;而Themes則存放該控制項的樣式。即,WPF自定義控制項,是通過樣式給我們的編輯的控制項類披上外衣而形成的。

下麵,我們來編寫一個簡單的時間控制項。

我們先將CustomControl1文件改名為KibaDateTime,然後打開KibaDateTime.cs文件,看到了一些控制項應用提示,這些提示寫的是自定義控制項的應用方式,我們先不看這些提示,因為他寫的不是很好理解。

接下來我們開始編寫時間控制項,修改KibaDateTime類如下:

public class KibaDateTime : TextBox
    {
        private static Regex regex = new Regex("[0-9]+");
        #region 小時
        public static readonly DependencyProperty HourProperty = DependencyProperty.Register(
             "Hour", typeof(int), typeof(KibaDateTime), new FrameworkPropertyMetadata(00));
       
        public int Hour
        {
            get
            {
                return (int)GetValue(HourProperty);
            }
            set
            {
                SetValue(HourProperty, value);
            }
        } 
        #endregion
        #region 分鐘
        public static readonly DependencyProperty MinuteProperty = DependencyProperty.Register(
             "Minute", typeof(int), typeof(KibaDateTime), new FrameworkPropertyMetadata(00));
        
        public int Minute
        {
            get
            {
                return (int)GetValue(MinuteProperty);
            }
            set
            {
                SetValue(MinuteProperty, value);
            }
        }
        #endregion
        #region 秒
        public static readonly DependencyProperty SecondProperty = DependencyProperty.Register(
             "Second", typeof(int), typeof(KibaDateTime), new FrameworkPropertyMetadata(00)); 
        public int Second
        {
            get
            {
                return (int)GetValue(SecondProperty);
            }
            set
            {
                SetValue(SecondProperty, value);
            }
        }
        #endregion
        static KibaDateTime()
        {
            //當此依賴項屬性位於指定類型的實例上時為其指定替換元數據,以在該依賴項屬性繼承自基類型時重寫該屬性已存在的元數據。
            DefaultStyleKeyProperty.OverrideMetadata(typeof(KibaDateTime), new FrameworkPropertyMetadata(typeof(KibaDateTime))); 
        }
    }

如上述代碼所示,我們修改了KibaDateTime繼承的類;將Control改為了TextBox。

這樣,我們就可以在KibaDateTime控制項的樣式中,用使用TextBox的屬性,進行綁定了。

然後,我們在控制項類里定義三個依賴屬性,小時、分鐘、秒;之後,我們會把這個三個屬性,綁定到樣式中。

現在我們打開Theme文件下的Generic.xaml文件,看到樣式代碼如下:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:KibaCustomControl">
    <Style TargetType="{x:Type local:KibaDateTime}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:KibaDateTime}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style> 
</ResourceDictionary>

從代碼中可以看到,系統已經為我們定義好了KibaDateTime控制項的外殼樣式。

我們需要做的就是將樣式內容添加進去。

我們在Border中,添加TextBox,然後進行小時、分鐘、秒的綁定,這裡要用Binding來綁定。

添加的TextBox代碼如下,我們進行了一些簡單寬高和間距設置。

<TextBox Text="{Binding Hour,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Width="24" Height="24" Padding="2,3,0,0" FontSize="12" ></TextBox>
<TextBox Text="{Binding Minute,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Width="24" Height="24" Padding="2,3,0,0" FontSize="12" ></TextBox>
<TextBox Text="{Binding Second,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" Width="24" Height="24" Padding="2,3,0,0" FontSize="12" ></TextBox>

上述代碼使用了【RelativeSource={RelativeSource TemplatedParent}】來尋找綁定源,註意,這裡一定要用TemplatedParent,不然無法綁定到我們控制項類。

自定義控制項到此為止,就已經定義好了。然後我們使用下剛剛定義好的控制項。

WPF自定義控制項應用

首先創建一個WPF項目,然後引用KibaCustomControl這個程式集。如下圖:

然後,在MainWindow.xaml頁面中,使用該控制項。

修改MainWindow.xaml頁面代碼如下:

<Window x:Class="KibaTestControl.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:c="clr-namespace:KibaCustomControl;assembly=KibaCustomControl"
        xmlns:local="clr-namespace:KibaTestControl"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <DockPanel>
        <StackPanel VerticalAlignment="Top" Margin="10" Orientation="Horizontal">
            <c:KibaDateTime Name="dtHour"></c:KibaDateTime> 
            <Button Content="查看時間" Click="Button_Click" Width="75"/>
        </StackPanel>
    </DockPanel>
</Window>

其中【xmlns:c="clr-namespace:KibaCustomControl;assembly=KibaCustomControl"】這句話是將我們自定義的程式集內的控制項,引入到當前頁。

【<c:KibaDateTime Text="00" ></c:KibaDateTime>】這句話就是我們自定義控制項的應用了。

應用界面如下圖所示:

其中查看時間的事件代碼如下:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("小時:"+dtHour.Hour+":"+dtHour.Minute + ":" + dtHour.Second);
}

修改時間,點擊查看時間,得到結果如下:

到此,這個簡單的WPF控制項,就開發完了。

----------------------------------------------------------------------------------------------------

代碼已經傳到Github上了,歡迎大家下載。

Github地址:https://github.com/kiba518/KibaWpfCustomControl

----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯,請點擊下右下角的推薦】,非常感謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,是函數式編程的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各 ...
  • 前面為了方便我們只是簡單實現了基本業務功能的增刪改查,但是登錄功能還沒有實現,而登錄又是系統所必須的,得益於 ASP.NET Core的可擴展性因此我們很容易實現我們的登錄功能。今天我將帶著大家一起來實現下我們的ASP.NET Core2.2開發的CMS系統的登錄及驗證碼功能。如果你覺得文中有任何不 ...
  • 問題:前臺checkbox控制項,選中值為1,不選值為0; 解決方案: 插入一行 <input type="hidden" name="RemberPwd" value="0"/> name值和checkbox值一致,當不選中該覆選框時,asp會預設取同name的控制項值。後臺通過response.fo ...
  • 一、在C#7.0以上版本中,方法的返回值可以通過關鍵字ref指定為返回變數的引用(而不是值)給調用方,這稱為引用返回值(Reference Return Value,或ref returns); 1.與引用參數一樣,使用關鍵字ref聲明引用返回值: 2.使用引用返回值避免了值類型在方法返回時的淺拷貝 ...
  • 1. 先手動引用DLL或者通過NuGet查找引用,這裡提供一個AjaxPro.2.dll的下載; 2. 之後的的過程不想寫了,網上都大同小異的,直接參考以前大佬寫的: AjaxPro2完整入門教程 總結:13年就有這個東西了,我到19年才知道,果然還是眼界太狹窄了; ...
  • 重置密碼:先生成重置密碼的Token,然後調用ResetPassword方法重置密碼,密碼要符合規則.. ...
  • using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Text;using System.Web;using System.Web.UI;using Syst ...
  • 前面有說明使用EF動態新建資料庫與表,資料庫使用的是SQL SERVER2008的,在使用MYSQL的時候還是有所不同 一、添加 EntityFramework.dll ,System.Data.Entity.dll ,MySql.Data, MySql.Data.Entity.EF6 註意:Ent ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...