جدا کردن 3رقم 3 رقم اعداد در TextBox در WPF با کدهای xaml
سلام
میخوام در WPF سی شارپ در یک تکست باکس فرمت اون در نمایش به شکلی باشه که اعداد رو 3 رقم 3 رقم جدا کنه.
یعنی کاربر بلافاصه بعد از تایپ چند عدد در سی شارپ کاربر عدد رو جدا شده ببینه.
به این شکل :
15000000 => 15,000,000
اما نمیخوام این کار رو توی Code Behind انجام بدم یعین نمیخوام خودم برنامه این رو بنویسم.
توی مثال های توی اینترنت یه همچین چیزی هست اما نتونستم استفاده کنم این خطا رو داره :
<Text="{Binding StringFormat={}{0:N0}}"/>

یا این :
<TextBox Width="auto" Binding="{Binding Path=Price,StringFormat='#,#\\,-'}"/>
توی این دو مثال بالا موفق به استفاده نشدم چون یا خطا داره یا عکس العملی نشون نمیده !
همچنین تکست باکس مسک هم دارم که نمیدونم این همچین قابلیتی داره یا نه :
<xctk:MaskedTextBox Mask="0000" PromptChar=" " x:Name="txtname" HorizontalContentAlignment="Right" HorizontalAlignment="Left" Height="22" Margin="512,296,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="152"/>
توی اینترنت خیلی گشتم ولی راه حلی مناسبی ندیدم فکر میکنم WPF باید برای این کار یه قابلیت ساده داشته باشه مثل نرم افزار های دیگه که توی فرمتش TextBox شون میگن : #,###
ممنون از اینکه برای این سوال وقت میذارید.
متشکرم
پاسخ هوش مصنوعی
برای جداسازی اعداد در یک TextBox در WPF با فرمت 3 رقم 3 رقم، می توانید از یک تبدیل کننده (Value Converter) استفاده کنید. این روش به شما این امکان را می دهد که فرمت نمایش اعداد را بدون نیاز به نوشتن کد در پشت صحنه، انجام دهید.
در ادامه مثالی از نحوه ایجاد یک Value Converter برای این کار ارایه می شود:
public class NumberFormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is null || !double.TryParse(value.ToString(), out double number))
{
return string.Empty;
}
return string.Format(culture, "{0:N0}", number);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string strValue && double.TryParse(strValue, NumberStyles.AllowThousands, culture, out double number))
{
return number;
}
return 0;
}
}
سپس این تبدیل کننده را باید به XAML خود اضافه کنید. شما می توانید آن را به منابع XAML خود اضافه کنید:
سپس می توانید از این تبدیل کننده در TextBox خود استفاده کنید:
این کد به شما کمک می کند تا عددی که کاربر وارد می کند به فرمت 3 رقم 3 رقم نمایش داده شود. همچنین برای تبدیل مجدد اعداد به عدد صحیح، قسمت `ConvertBack` کمک خواهد کرد.
اگر از MaskedTextBox استفاده می کنید، می توانید از قابلیت های آن برای ایجاد یک Mask مناسب استفاده کنید، اما معمولا برای جداسازی اعداد باید از Value Converter استفاده کنید.
سلام دوست گرامی
در مورد سوالتون باید بگم اینکه شما زمانی میتونید به تکست باکس خودتون این قابلیت رو بدید که مقدار این تکست باکس رو به یک Property از نوع غیر رشته بایند کنید. و چون شما می خواهید زمانی که کاربر توی تکست باکس تایپ می کنه این اعداد جدا بشه و چون مقدار Text تکست باکس از نوع رشته هست نه از نوع double یا int به همین خاطر دیگه FormatString تکست باکس از کار میفته و به همین دلیله که کد شما کار نمیکنه.
راه حل چیست؟
شما یا باید از کامپوننت خاصی استفاده کنید این کار رو انجام بده. برخی از ابزارهای تکست باکس وجود داره که این کار رو انجام میده، فقط کافیه یه سرج تو اینترنت بزنید و کامپوننت تکست باکس ها مخصوص این کار رو پیدا کنید. (من خودم چون در این مورد از کامپوننت استفاده نمی کنم موردی رو هم نمی شناسم که معرفی کنم)
راه حل دوم استفاده از یک کلاس هست که تکست باکس مورد نظرتون رو به قابلیت جداکننده اعداد تبدیل میکنه!!
در این روش که روش ابداعی خودم هست یک کلاس در بدنه نرم افزار شما قرار میگیره و شما هر تکست باکسی که میخواهید از نوع جدا کننده باشه به اول نام اون Num (مخفف Number) رو اضافه می کنید. کار این کلاس اینه که تمام تکست باکس هایی که در پروژه شما، نام اونها با این سه حرف شروع بشه رو شناسایی می کنه و برای اونها یک Code Behind مخصوص خودش رو می سازه و بدون اینکه شما حتی یک خط کد اضافی بنویسید تکست باکس شمارو سفارشی می کنه و format string برای اونها فعال میکنه. طوری که انگار از کامپوننت استفاده کردید!
لازم به ذکر است که Num سه حرفی است که من خودم گذاشتم و شما میتونید به سلیقه خودتون تغییرش بدید.
برای استفاده از این روش در بدنه نرم افزار خودتون کلاس زیر رو قرار بدید.
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Collections.Generic;
namespace CustomTexbox
{
class TextBoxFormat
{
public static void FormatStringTexBox(Window win)
{
foreach (var item in FindVisualChildren<TextBox>(win))
{
if (item.Name.StartsWith("Num")) //// نماد شناسایی تکست باکس که میتونه به دلخواه شما تغییر کنه
{
item.TextChanged += new TextChangedEventHandler(FormatTextBoxNumber);
}
}
}
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
yield return (T)child;
foreach (T childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}
}
public static void FormatTextBoxNumber(object sender, RoutedEventArgs e)
{
try
{
//////////////////جدا کردن سه رقم اعداد
var text = ((TextBox)sender);
if (text.Text.Length == 0) { return; }
double range;
if (!Double.TryParse(text.Text, out range))
{
text.Text = text.Text.Replace(text.Text.Substring(text.Text.Length - 1, 1), "");
}
if (text.Text != string.Empty)
{
if (text.Text.Substring(text.Text.Length - 1, 1) == ".") { return; }
text.Text = string.Format("{0:#,##0.####}", double.Parse(text.Text.Trim()));
text.Select(text.MaxLength, 0);
}
////////////////////////////////////////
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
من نام این کلاس رو CustomTexbox گذاشتم ولی شما هر نام دیگه که دوست دارید میتونید بذارید.
حالا فقط کافیه که به اول نام تکست باکس خود Num رو اضافه کنید. مانند نمونه زیر:
<TextBox x:Name="Num_Textbox1" Text="" MaxLength="25" />
خاصیت MaxLength رو هم برای تکست باکس فعال کنید. عددش مهم نیست فقط فعال باشه (من روی 25 گذاشتم)
فقط باید ویندو یا فرمی که میخواهید باهاش کار کنید رو فعال کنید تا کلاس ما بتونه اون رو بشناسه. برای این کار توی رویداد لود فرم خودتون کد زیر رو هم بنویسید و تمام...
TextBoxFormat.FormatStringTexBox(this);
حالا دیگه توی فرم خودتون به هر تعداد تکس باکس که دوست دارید میتونید قرار بدید و بدون نوشتن حتی یک خط Code behinde تکست باکس مخصوص اعداد داشته باشید.
دوستان خوبم این روش رو من خودم طراحی کردم و اگر کسی از دوستان نظر یا پیشنهادی برای بهتر کردن این روش داره خوشحال میشم که مطرح کنه.
این یکی هم با بایندینگ کردن میشه
XAML :
<TextBox x:Name="txt1" TextWrapping="Wrap" Text="{Binding NumericValue, StringFormat={}{0:N0},UpdateSourceTrigger=PropertyChanged}"/>
Binding :
public partial class MainWindow : Window
{
public static readonly DependencyProperty NumericValueProperty = DependencyProperty.Register(
"NumericValue",
typeof(double),
typeof(MainWindow),
new PropertyMetadata(default(double), MainWindow.OnNumericValueChanged));
public double NumericValue
{
get => (double)GetValue(MainWindow.NumericValueProperty);
set => SetValue(MainWindow.NumericValueProperty, value);
}
// Property changed callbacck
private static void OnNumericValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = d as TextBox;
double newValue = (double)e.NewValue;
// Do something with the new value that was entered by the user
}
public MainWindow()
{
InitializeComponent();
// Set DataContext to the MainWindow itself
this.DataContext = this;
// We want 10000 to be displayed with thousands number groups
// like '10.000'
//this.NumericValue = 10000;
}
}
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول