【WPF】NumericUpDown的用法

在 WPF(Windows Presentation Foundation)中,NumericUpDown 控件并不是內置的標準控件之一,但它是一個非常常用的控件,用于讓用戶輸入一個數值(整數或浮點數),并提供上下箭頭來遞增或遞減數值。

在 WPF 中,你可以通過以下幾種方式來使用 NumericUpDown 控件:

方法一:使用?Xceed WPF Toolkit?中的?NumericUpDown

這是最常見和推薦的方式,Xceed 提供了一個強大的 WPF 工具包,其中就包含 NumericUpDown

1. 安裝 Xceed WPF Toolkit

使用 NuGet 安裝:Install-Package Extended.Wpf.Toolkit

或者通過 Visual Studio 的 NuGet 包管理器搜索安裝:Extended.Wpf.Toolkit

2. 在 XAML 中引用命名空間

<Window xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"...

3. 使用?NumericUpDown?控件

<xctk:NumericUpDown Name="numericUpDown1"Minimum="0"Maximum="100"Value="50"Increment="1"ShowButtonSpinner="True"FormatString="N0" />

4. 常用屬性說明:

屬性名說明
Value當前的數值(綁定用)
Minimum最小值
Maximum最大值
Increment每次遞增/遞減的步長
ShowButtonSpinner是否顯示上下箭頭按鈕(默認為 true)
FormatString顯示格式,例如?N0?表示整數,F2?表示兩位小數

?

方法二:使用自定義?UserControl?實現?NumericUpDown

如果你不想使用第三方庫,也可以自己創建一個 UserControl,包含一個 TextBox 和兩個 Button(↑ ↓)來模擬 NumericUpDown

示例結構:

<StackPanel Orientation="Horizontal"><TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" Width="50"/><StackPanel Orientation="Vertical"><Button Content="▲" Click="ButtonUp_Click" /><Button Content="▼" Click="ButtonDown_Click" /></StackPanel>
</StackPanel>

然后在后臺代碼或 ViewModel 中處理數值的加減邏輯。

?

方法三:使用?System.Windows.Forms?的?NumericUpDown(不推薦)

WPF 可以通過 WindowsFormsIntegration 使用 WinForm 控件,但不推薦,因為會引入混合技術棧,維護麻煩。

數據綁定示例(MVVM)

如果你使用 MVVM 模式,可以在 ViewModel 中定義屬性:

public class MainViewModel : INotifyPropertyChanged
{private decimal _value = 50;public decimal Value{get => _value;set{if (_value != value){_value = value;OnPropertyChanged();}}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}
}

XAML 綁定:

<xctk:NumericUpDown Value="{Binding Value}" Minimum="0" Maximum="100" />

注意事項

  • NumericUpDown?支持?decimal?類型,可以處理浮點數。
  • 支持格式化顯示,比如貨幣、百分比等。
  • 推薦使用 Xceed 的版本,功能強大且易于維護。

?

DataValidation的用法

高級功能(比如小數位數限制、負數禁用、事件處理等),可以進一步擴展或使用 DataValidation?

DataValidation 在 WPF 中主要用于確保用戶輸入的數據符合應用程序的預期格式和范圍。通過數據驗證,可以在用戶輸入非法數據時提供即時反饋,提升用戶體驗。WPF 提供了幾種方法來實現數據驗證功能,其中最常用的是使用 IDataErrorInfo 接口和 ExceptionValidationRule 類。

以下是兩種主要的數據驗證方法:

1. 使用?IDataErrorInfo?實現數據驗證

IDataErrorInfo 是一個接口,可以讓你在 ViewModel 或 Model 中定義屬性驗證邏輯。當綁定到一個實現了 IDataErrorInfo 的對象時,WPF 會自動調用這個接口的方法來獲取錯誤信息,并顯示給用戶。

示例代碼:

首先,確保你的 ViewModel 實現了 IDataErrorInfo 接口:

public class MainViewModel : INotifyPropertyChanged, IDataErrorInfo
{private decimal _value;public decimal Value{get => _value;set{if (_value != value){_value = value;OnPropertyChanged();}}}public string Error => null;public string this[string columnName]{get{if (columnName == nameof(Value)){if (Value < 0 || Value > 100){return "數值必須在0到100之間";}}return null;}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}
}

然后,在 XAML 中配置綁定以啟用驗證:

<Window x:Class="YourNamespace.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid><xctk:NumericUpDown Value="{Binding Value, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Minimum="0" Maximum="100" /></Grid>
</Window>

注意:ValidatesOnDataErrors=TrueNotifyOnValidationError=True 需要設置以啟用數據驗證。

2. 使用?ExceptionValidationRule?實現數據驗證

另一種方式是使用 ExceptionValidationRule 來處理異常情況作為驗證錯誤。這種方式適用于你希望直接從屬性 setter 方法中拋出異常的情況。

示例代碼:

假設我們有一個簡單的屬性驗證邏輯,它會在不滿足條件時拋出異常:

private decimal _value;
public decimal Value
{get => _value;set{if (value < 0 || value > 100){throw new ArgumentException("數值必須在0到100之間");}_value = value;OnPropertyChanged();}
}

?接下來,在 XAML 中配置綁定以使用 ExceptionValidationRule

<xctk:NumericUpDown Value="{Binding Value}"><xctk:NumericUpDown.BindingGroup><BindingGroup><BindingGroup.ValidationRules><ExceptionValidationRule/></BindingGroup.ValidationRules></BindingGroup></xctk:NumericUpDown.BindingGroup>
</xctk:NumericUpDown>

總結

  • IDataErrorInfo?是一種靈活且易于管理的數據驗證方法,特別適合于 MVVM 模式。
  • ExceptionValidationRule?更加直接,但不如?IDataErrorInfo?靈活,通常用于需要拋出異常的場景。

根據你的需求選擇合適的數據驗證策略。如果你正在使用 MVVM 模式,推薦使用 IDataErrorInfo。如果需要更復雜的驗證邏輯或跨字段驗證,可能還需要考慮其他技術如 INotifyDataErrorInfo(適用于 .NET Framework 4.5 及以上版本)。

?

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

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

相關文章

Kotlin位運算

Kotlin 提供了幾種用于操作整數各個位&#xff08;bit&#xff09; 的運算符。這些操作是由處理器直接支持的&#xff0c;速度快且操作簡單。在底層編程中非常重要&#xff0c;比如設備驅動、低級圖形處理、網絡通信、加密和壓縮等。 盡管計算機通常都有高效的硬件指令來執行算…

墨者:通過手工解決SQL手工注入漏洞測試(MongoDB數據庫)

一、SQL手工注入漏洞測試(MongoDB數據庫) 本文以墨者學院靶場為例&#xff0c;演示MongoDB數據庫的手工SQL注入全過程。靶場以自己的地址為準&#xff1a;http://124.70.71.251:42286/new_list.php?id1 二、注入原理說明 MongoDB作為NoSQL數據庫&#xff0c;其注入方式與傳…

Kafka——CommitFailedException異常處理深度解析

引言在分布式消息系統Kafka的生態中&#xff0c;消費者組&#xff08;Consumer Group&#xff09;機制是實現高吞吐量和負載均衡的核心設計。然而&#xff0c;消費過程中位移提交&#xff08;Offset Commit&#xff09;的穩定性始終是開發者面臨的最大挑戰之一。當消費者嘗試提…

kafka的部署和jmeter連接kafka

zookeeper的安裝 kafka依賴Zookeeper所以要先安裝Zookeeper kafka的安裝文章引用來源:Kafka下載和使用&#xff08;linux版&#xff09;-CSDN博客 通過wget命令安裝 # 安裝wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.7.1-bin.tar.gz# 解壓tar…

Android UI 組件系列(八):ListView 基礎用法與適配器詳解

博客專欄&#xff1a;Android初級入門UI組件與布局 源碼&#xff1a;通過網盤分享的文件&#xff1a;Android入門布局及UI相關案例 鏈接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取碼: 4k9n 一、引言 在上一篇文章《Android UI 組件系列&#xff08;…

Android學習專題目錄(持續更新)

1.Android 調試 1.1&#xff1a;Logcat日志分析 2.Android編譯 2.1&#xff1a;android編譯過程中的mk文件和bp文件的掃描機制 2.2&#xff1a;Android 構建系統中常見的 .mk 文件及其作用 2.3&#xff1a;Android構建系統中的mk文件語法函數 2.4&#xff1a;安卓中定…

c#Lambda 表達式與事件核心知識點整理

一、Lambda 表達式1. 概念 Lambda 表達式是一種匿名函數&#xff08;無名稱的函數&#xff09;&#xff0c;簡化了委托和匿名方法的寫法&#xff0c;格式為&#xff1a; (參數列表) > 表達式或語句塊 它可以作為參數傳遞&#xff0c;或賦值給委托類型變量。2. 基本語法與簡寫…

Springboot+Layui英語單詞學習系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBootLayUI框架持久層框架MyBaits成功系統案例&#xff1a;參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸…

主要分布于內側內嗅皮層的層Ⅲ的邊界向量細胞(BVCs)對NLP中的深層語義分析的積極影響和啟示

邊界向量細胞&#xff08;Boundary Vector Cells, BVCs&#xff09;主要分布于內側內嗅皮層&#xff08;MEC&#xff09;層Ⅲ&#xff0c;通過編碼環境邊界&#xff08;如墻壁、障礙物&#xff09;的距離和方向信息&#xff0c;為空間導航提供幾何參考框架。這一神經機制對自然…

Selenium是解決了什么問題的技術?

Selenium 是一種用于自動化瀏覽器操作的技術&#xff0c;主要解決了以下問題&#xff1a;1. 自動化測試 Selenium 最初是為了解決 Web 應用程序的自動化測試 問題而設計的。它可以幫助開發者和測試人員&#xff1a; 模擬用戶操作&#xff1a;如點擊按鈕、填寫表單、選擇下拉菜單…

JavaSE知識點(2)

目錄 訪問修飾符的區別 this關鍵字的作用 抽象類和接口有什么區別 抽象類可以定義構造方法嗎 但是接口不可以定義構造方法 Java支持多繼承嗎 接口可以多繼承嗎 繼承和抽象的區別&#xff1f; 抽象類和普通類的區別 成員變量和局部變量的區別&#xff1f; staic關鍵字…

(實用教程)Linux操作系統(二)

centos配置靜態ip 注意&#xff1a; 1.系統中的網關要與虛擬機編輯器中的網關保持一致 2.如果配置虛擬機編輯器后發現ping不通外網的時候&#xff0c;就要還原默認設置再進行配置 總結&#xff1a; 虛擬機編輯器需要配置ip&#xff0c;網關&#xff0c;其中ip網段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例實現

ThinkPHP8集成RabbitMQ的完整案例實現一、安裝依賴&#xff1a;需通過Composer安裝php-amqplib庫?二、配置RabbitMQ三、生產者1、發送一個郵件&#xff0c;將任務發送到RabbitMQ隊列中。2、運行結果展示四、啟動消費者&#xff1a;命令行執行php think rabbitmq:consumer1&…

解密負載均衡:如何輕松提升業務性能

什么是負載均衡 負載均衡&#xff1a;Load Balance&#xff0c;簡稱LB&#xff0c;是一種服務或基于硬件設備等實現的高可用反向代理技術&#xff0c;負載均衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個后端特定的服務器或設備&#xff0c;從而提高了 公司業務的…

mac neo4j install verifcation

本文使用conda環境安裝&#xff0c;neo4j所依賴jdk也采用conda install的方式安裝。 1 neo4j下載 點擊如下鏈接&#xff0c;選擇community, Linux/Mac Executor&#xff0c;點擊Download Community。 本文下載的安裝包是 neo4j-community-2025.06.2-unix.tar.gz 2 安裝neo4j …

【Oracle】Oracle分區表“排雷“指南:當ORA-14400錯誤找上門時如何優雅應對

引言&#xff1a;分區表里的"定時炸彈"凌晨三點的機房&#xff0c;你盯著屏幕上刺眼的ORA-14400: 插入的分區鍵值超出所有分區范圍錯誤&#xff0c;后背發涼。這個錯誤就像埋在分區表里的定時炸彈&#xff0c;一旦觸發就會讓整個應用癱瘓。但別慌&#xff01;本文將帶…

設計模式(十四)行為型:職責鏈模式詳解

設計模式&#xff08;十四&#xff09;行為型&#xff1a;職責鏈模式詳解職責鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于將多個處理對象&#xff08;處理器&#xff09;連接成一條鏈&am…

WAIC 2025 熱點解讀:如何構建 AI 時代的“視頻神經中樞”?

一、&#x1f310; WAIC 2025 大會看點&#xff1a;AI 正在“長出眼睛與身體” 在 2025 年的人工智能大會&#xff08;WAIC 2025&#xff09;上&#xff0c;“大模型退幕后&#xff0c;具身智能登場”成為最具共識的趨勢轉向。從展區到主論壇&#xff0c;再到各大企業發布的新…

OpenCV+Python

安裝 OpenCV&#xff1a; Python&#xff1a;直接 pip install opencv-python&#xff08;核心庫&#xff09;和 opencv-contrib-python&#xff08;擴展功能&#xff09;。 pip install opencv-python pip install opencv-contrib-python 驗證安裝&#xff1a; import cv2…

現代C++的一般編程規范

一般情況下不要使用std::endl&#xff0c;尤其是在循環中&#xff0c;因為可能一開始你只是想要打印一個換行符&#xff0c;但是"endl"做的更多&#xff0c;其還會刷新緩沖區&#xff0c;這會額外花費很多時間&#xff0c;相反&#xff0c;只需要使用“\n"&…