سلام
میخوام در 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 شون میگن : #,###
ممنون از اینکه برای این سوال وقت میذارید.
متشکرم
سلام دوست گرامی
در مورد سوالتون باید بگم اینکه شما زمانی میتونید به تکست باکس خودتون این قابلیت رو بدید که مقدار این تکست باکس رو به یک 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;
}
}
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1113
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
565
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
300
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
272
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4221
- پاسخ :
1
|
تاریخ :
1398/09/16
- ساعت :
11:41:00 AM
- بازدید :
4242
- پاسخ :
1
|
تاریخ :
1398/09/07
- ساعت :
02:15:00 PM
- بازدید :
3836
- پاسخ :
5
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
550
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3146
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3232
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
370
- پاسخ :
1
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
909
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
891
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1281
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4746
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1113
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
565
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
126
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
72
- پاسخ :
0
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
300
- پاسخ :
1
|