WPF學習(四)

文章目錄

  • 一、用戶控價
    • 1.1 依賴屬性的注冊
    • 1.2 具體使用

一、用戶控價

1.1 依賴屬性的注冊

using System.Windows;
using System.Windows.Controls;namespace WpfApp
{public partial class MyUserControl : UserControl{// 依賴屬性:外部可綁定的文本public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text",typeof(string),typeof(MyUserControl),new FrameworkPropertyMetadata(string.Empty,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,OnTextPropertyChanged));public string Text{get => (string)GetValue(TextProperty);set => SetValue(TextProperty, value);}// 自定義事件:提交按鈕點擊public static readonly RoutedEvent SubmitClickedEvent =EventManager.RegisterRoutedEvent("SubmitClicked",RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(MyUserControl));public event RoutedEventHandler SubmitClicked{add => AddHandler(SubmitClickedEvent, value);remove => RemoveHandler(SubmitClickedEvent, value);}public MyUserControl(){InitializeComponent();DataContext = new MyUserControlViewModel(this);}private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = (MyUserControl)d;control.RaiseEvent(new RoutedEventArgs(SubmitClickedEvent));}}
}

這段代碼是在WPF中注冊依賴屬性(Dependency Property) 的標準寫法,下面來詳細解釋它的作用和參數含義:

1. 函數整體作用
DependencyProperty.Register 是WPF中創建依賴屬性的核心方法。它做了兩件事:

  • 定義屬性元數據:包括屬性名稱、類型、所有者類型、默認值等。
  • 返回屬性標識符:通過靜態字段(如 TextProperty)保存,用于后續通過 GetValue/SetValue 訪問屬性值。

2. 參數詳解

public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text",                  // 參數1:屬性名稱(字符串)typeof(string),          // 參數2:屬性類型(Type)typeof(MyUserControl),   // 參數3:所有者類型(Type)new FrameworkPropertyMetadata(  // 參數4:元數據string.Empty,    // 默認值FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,  // 綁定模式OnTextPropertyChanged  // 值變更回調));

參數1:“Text”

  • 含義:這是依賴屬性的名稱,必須與CLR包裝器屬性名一致(即類中的 public string Text { get; set; })。
  • 作用:WPF內部通過這個名稱識別屬性,例如在XAML中使用 <MyUserControl Text="Hello" />

參數2:typeof(string)

  • 含義:屬性的類型,這里是字符串類型。
  • 作用:確保屬性值類型安全,WPF會自動進行類型檢查。

參數3:typeof(MyUserControl)

  • 含義:聲明該依賴屬性的所有者類型,即哪個類擁有這個屬性。
  • 作用:允許同一個依賴屬性被多個類共享(通過 AddOwner 方法),但這里 MyUserControl 是原始所有者。

參數4:FrameworkPropertyMetadata

  • 默認值(string.Empty):屬性未被顯式設置時的默認值。
  • 綁定模式(BindsTwoWayByDefault)
    • 表示此屬性的默認綁定模式是雙向綁定(Mode=TwoWay)。
    • 例如:<MyUserControl Text="{Binding SomeValue}" /> 會自動成為雙向綁定。
  • 回調方法(OnTextPropertyChanged)
    • 當屬性值變化時,WPF會自動調用這個靜態方法。
    • 常用于實現屬性變更通知或依賴操作。

3. 參數"Text"屬于誰?
參數 "Text"MyUserControl 類的公共屬性。通過依賴屬性機制,這個屬性:

  1. 可在XAML中直接使用
    <local:MyUserControl Text="直接設置值" />
    
  2. 支持數據綁定
    <local:MyUserControl Text="{Binding ViewModelProperty}" />
    
  3. 可通過代碼訪問
    myUserControl.Text = "通過代碼設置";
    

4. 依賴屬性 vs 普通屬性

特性普通屬性依賴屬性
存儲方式實例字段(如 private string _text由WPF屬性系統統一管理
默認值在構造函數中設置通過元數據設置(全局唯一)
數據綁定需要手動實現 INotifyPropertyChanged原生支持,自動通知
樣式/動畫支持不支持支持(可被樣式覆蓋、可動畫化)
繼承性部分屬性支持值繼承(如 FontSize

※※※
5. 完整工作流程

  1. 注冊階段

    • 通過 DependencyProperty.Register 創建屬性定義。
    • 靜態字段 TextProperty 保存屬性標識符。
  2. CLR包裝器(可選但推薦):

    public string Text
    {get => (string)GetValue(TextProperty);set => SetValue(TextProperty, value);
    }
    
  3. 使用階段

    • XAML中:<MyUserControl Text="值" />
    • 代碼中:myControl.Text = "值";
    • 數據綁定時:WPF通過 TextProperty 標識符解析屬性。

總結

  • “Text” 參數:是 MyUserControl 類的公共屬性名,用于外部訪問。
  • 依賴屬性機制:讓屬性具備動態值解析、數據綁定、樣式支持等高級特性,是WPF控件開發的核心技術。

1.2 具體使用

MainWindow.xaml

<Window x:Class="WpfApp2.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:local="clr-namespace:WpfApp2"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel><local:UserControl1 Margin="10" Height="200" Width="250" x:Name="userControl"/><Button Content="button1" Click="Button_Click_1"/><Button Content="button2" Click="Button_Click_2"/></StackPanel></Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfApp2
{/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Button_Click_1(object sender, RoutedEventArgs e){userControl.Text = "你大爺";}private void Button_Click_2(object sender, RoutedEventArgs e){userControl.Text = "你 好";}}
}

UserControl1.xaml

<UserControl x:Class="WpfApp2.UserControl1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp2"mc:Ignorable="d" d:DesignHeight="100" d:DesignWidth="200"><Grid><TextBox x:Name="txtInput" Margin="10" /><Button Content="提交" Click="Button_Click" Margin="10,50,10,10" /><TextBlock x:Name="lblOutput" Margin="10,90,10,10" /></Grid>
</UserControl>

UserControl1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfApp2
{/// <summary>/// UserControl1.xaml 的交互邏輯/// </summary>public partial class UserControl1 : UserControl{public UserControl1(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){lblOutput.Text = "你輸入的是:" + txtInput.Text;}public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text",                // 屬性名typeof(string),        // 屬性類型typeof(UserControl1), // 所有者類型new PropertyMetadata(  // 元數據string.Empty,      // 默認值OnTextPropertyChanged  // 值變更回調));public string Text{get => (string)GetValue(TextProperty);set => SetValue(TextProperty, value);}private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = (UserControl1)d;control.lblOutput.Text = "屬性值:" + e.NewValue;}}
}

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

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

相關文章

vue3+typescript項目配置路徑別名@

1. vite.config.ts配置//方法1 import { defineConfig } from vite; import vue from vitejs/plugin-vue; import path from path;export default defineConfig({plugins: [vue()],resolve: {alias: {: path.resolve(__dirname, src)}} });//方法2,需要執行npm install -D type…

MySql 常用SQL語句、 SQL優化

???????????????SQL語句主要分為哪幾類 SQL&#xff08;結構化查詢語言&#xff09;是用于管理和操作關系型數據庫的標準語言&#xff0c;其語句通常根據功能劃分為以下幾大類&#xff0c;每類包含不同的子句和命令&#xff0c;用于實現特定的數據庫操作需求&am…

代理模式實戰指南:打造高性能RPC調用與智能圖片加載系統

代理模式實戰指南&#xff1a;打造高性能RPC調用與智能圖片加載系統 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量…

登山第二十六梯:單目3D檢測一切——一只眼看世界

文章目錄 一 摘要 二 資源 三 內容 一 摘要 盡管深度學習在近距離 3D 對象檢測方面取得了成功&#xff0c;但現有方法難以實現對新對象和相機配置的零鏡頭泛化。我們介紹了 DetAny3D&#xff0c;這是一種可提示的 3D 檢測基礎模型&#xff0c;能夠在任意相機配置下僅使用單目…

ROS2簡記一:第一個ros2程序,海龜模擬與C++和python的《你好,世界!》

目錄 引言 一、控制小海龜 二、鍵盤控制海龜 三、控制海龜案例的簡單分析 四、ROS2之linux基礎 4.1 linux終端命令 4.1.1 查看當前終端所在目錄 pwd 4.1.2 切換終端所在目錄 cd 4.1.3 查看當前目錄下的文件 ls 4.1.4 主目錄 ~ 4.1.5 文件的操作 4.1.6 命令使用幫助…

監控的基本理論和prometheus安裝

監控的基本理論和prometheus安裝 前言 這篇博客主要講的是關于理論的知識&#xff0c;大家盡可能的消化和吸收&#xff0c;也能擴展大家的知識面 監控的基本概念 監控俗稱為運維的第三只眼。沒有了監控&#xff0c;業務運維都是“瞎子”。所以說監控室運維這個職業的根本&…

互聯網生態下贏家群體的崛起與“開源AI智能名片鏈動2+1模式S2B2C商城小程序“的賦能效應

摘要&#xff1a;本文聚焦未來互聯網贏家群體的構成特征&#xff0c;剖析網紅經濟與專業主播的差異化發展路徑&#xff0c;結合開源AI智能名片鏈動21模式與S2B2C商城小程序的融合創新&#xff0c;提出技術賦能下互聯網商業生態的重構路徑。研究表明&#xff0c;開源AI技術通過智…

OneCode 圖表組件核心優勢解析

一、全方位的可視化能力 OneCode 圖表組件提供了15種專業圖表類型&#xff0c;覆蓋從基礎到高級的數據可視化需求&#xff1a; 基礎圖表&#xff1a;柱狀圖、折線圖、餅圖、面積圖等高級圖表&#xff1a;金字塔圖、雷達圖、儀表盤、LED圖表等實時圖表&#xff1a;實時折線圖、實…

【Linux】RHCE中ansible的配置

1.安裝并配置ansible 第一步先安裝ansible所需軟件 #安裝ansible所需軟件 [devopsworkstation ~]$ sudo dnf install ansible ansible-navigator rhel-system-roles -y 第二步登錄鏡像倉庫&#xff0c;在鏡像倉庫下載鏡像容器來運行ansible 由于ansible-navigator 知ansible…

ubuntu server系統 安裝寶塔

更新系統軟件包sudo apt update && sudo apt upgrade -y提示&#xff0c;如果想博主這樣是存綠色liunx系統&#xff0c;要先安裝python3腳本才可以python3 --version有pyhton版本號就是安裝了&#xff0c;沒有的話就要安裝安裝 Pythonsudo apt update sudo apt install…

用C++實現五子棋游戲

#include <iostream> #include <vector> #include <string> #include <iomanip> // 用于控制輸出格式 #include <limits> // 用于numeric_limitsusing namespace std;// 游戲常量定義 const int BOARD_SIZE 15; // 定義棋盤大小為15x15// 棋…

【LeetCode 熱題 100】73. 矩陣置零——(解法一)空間復雜度 O(M + N)

Problem: 73. 矩陣置零 題目&#xff1a;給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(M * N)空間復雜度&#xff1a;O(M N)整體思路…

【深度學習新浪潮】國內零樣本抗體設計的科研進展如何?

什么是AI零樣本抗體設計? AI零樣本抗體設計(Zero-shot AI Antibody Design)是指不依賴任何已知抗體序列或結構數據,僅根據靶點抗原信息,通過人工智能直接生成具有高親和力、高特異性的全新抗體序列的技術。其核心在于突破傳統抗體研發的“數據依賴瓶頸”,實現真正的“從…

【論文閱讀】A Diffusion model for POI recommendation

論文出處&#xff1a;ACM Transactions on Information Systems (TOIS) SCI一區 CCF-A期刊 論文地址&#xff1a;[2304.07041] A Diffusion model for POI recommendation 論文代碼&#xff1a;Yifang-Qin/Diff-POI: The official PyTorch implementation of Diff-POI. 目…

Rust實現FasterR-CNN目標檢測全流程

使用 Rust 和 FasterR-CNN 進行目標檢測 FasterR-CNN 是目標檢測領域廣泛使用的深度學習模型。Rust 生態中可以通過 tch-rs(Torch 綁定)調用預訓練的 PyTorch 模型實現。以下為完整實現步驟: 環境準備 安裝 Rust 和必要的依賴: cargo add tch cargo add anyhow # 錯誤…

Github 2025-07-03Go開源項目日報Top10

根據Github Trendings的統計,今日(2025-07-03統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10JavaScript項目2Go編程語言:構建簡單、可靠和高效的軟件 創建周期:3474 天開發語言:Go協議類型:BSD 3-Clause “New” or “Revise…

XML Schema 安裝使用教程

一、XML Schema 簡介 XML Schema&#xff08;XSD&#xff0c;全稱 XML Schema Definition&#xff09;是用于定義 XML 文檔結構、數據類型和數據約束的標準方式。它比 DTD 更加強大&#xff0c;支持數據類型、默認值、命名空間等&#xff0c;是企業級 XML 應用推薦的驗證方式。…

【字節跳動】數據挖掘面試題0008:計算西瓜視頻內容好評率

文章大綱題目描述題目描述 西瓜視頻近期開展了”2020百大人氣創作者”優質內容扶持項目&#xff0c;鼓勵用戶產出優質的視頻內容。 現需要統計2020年11月01日至2020年11月30日期間創作的視頻中&#xff0c; “科技”大類下“數碼測評"子類的視頻好評率&#xff08;好評率好…

Linux 進程控制:全面深入剖析進程創建、終止、替換與等待

文章目錄引言一、進程創建&#xff1a;fork()系統調用的奧秘1.1 fork()的基本原理1.2 代碼示例與解讀1.3 寫時復制&#xff08;COW&#xff09;優化二、進程終止&#xff1a;exit()與_exit()的抉擇2.1 exit()和_exit()的區別2.2 代碼示例與分析三、進程替換&#xff1a;exec()函…

PJSIP 中的 TCP 傳輸配置指南

PJSIP 支持通過 TCP 傳輸 SIP 消息&#xff0c;相比 UDP 提供了更可靠的傳輸機制。以下是關于在 PJSIP 中使用 TCP 的詳細指南。1. 創建 TCP 傳輸基本 TCP 傳輸配置cpjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port 5060; // SI…