如何制作不会覆盖 WPF 中样式的自定义文本框。XAML
How to make Custom TextBox that wouldn't override the style in WPF .XAML
所以,我制作了一个自定义文本框,它只允许数字:
public partial class IntegerTextBox : TextBox
{
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
Text = new String(Text.Where(c => Char.IsDigit(c)).ToArray());
SelectionStart = Text.Length;
}
}
我面临的问题是,当我以这种方式创建它时
IntegerTextBox textBox = new IntegerTextBox() {... };
或
<u:IntegerTextBox/>
在我的.xaml
它还会覆盖我正在工作的环境 (Milestone Systems) 使用的默认样式。因此,我没有得到我应该得到的灰色文本框,而是得到了 Windows 默认白色文本框。
在 Microsoft 文档中,我找到了一个带有解释的类似示例,但我似乎无法真正找到使其工作的方法:override example
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
// Insert code to do custom painting.
// If you want to completely change the appearance of your control,
// do not call base.OnPaint(pe).
}
据我了解,它说:不要调用
base.OnTextChanged(e);
(在我的例子中)如果你不想改变控件的外观。我尝试删除它并得到相同的结果。
出现此问题的原因可能是新的 IntegerTextBox class 不使用基本 TextBox class 使用的样式。
请参考以下线程,其中已经讨论了类似的问题:
如果您不想重新设置 TextBox 的样式,那么您甚至不需要创建自定义 TextBox,您只需要 "Attached Property".
在您的项目中(UI 项目,如果它是 MVVM)创建一个 class 就像使用下面的内容:
public class TextBoxExtensions
{
public static readonly DependencyProperty OnlyNumbersAllowedProperty =
DependencyProperty.Register("OnlyNumbersAllowed", typeof(int), typeof(TextBoxExtensions), new PropertyMetadata(false,
(o, args) =>
{
// Assuring we are dealing with TextBox.
if (!(o is TextBox textField))
return;
// make sure TextBox contains characters.
if (textField.Text.Length == 0)
return;
// if TextBox only contains numbers then we are fine and don't go any further.
if (textField.Text.All(char.IsDigit)) return;
// A letter has been written in TextBox so that we remove it.
var result = textField.Text.Remove(textField.Text.Length - 1, 1);
textField.Text = result;
}));
public static bool GetOnlyNumberSupported(DependencyObject obj)
{
return (bool)obj.GetValue(OnlyNumbersAllowedProperty);
}
public static void SetOnlyNumberSupported(DependencyObject obj, bool value)
{
obj.SetValue(OnlyNumbersAllowedProperty, value);
}
}
现在您可以在视图中的任何位置(仅限文本框)使用它,如下所示:
local:TextBoxExtensions.OnlyNumbersAllowed="True"
提示:本地是项目中上述 class 位置的路径,可以通过 "xmlns".
声明
为 App.xaml
中的 IntegerTextBox
定义隐式 Style
:
<Style TargetType="{x:Type local:IntegerTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
那么它应该继承当前应用于 <TextBox />
元素的任何隐式 Style
。
所以,我制作了一个自定义文本框,它只允许数字:
public partial class IntegerTextBox : TextBox
{
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
Text = new String(Text.Where(c => Char.IsDigit(c)).ToArray());
SelectionStart = Text.Length;
}
}
我面临的问题是,当我以这种方式创建它时
IntegerTextBox textBox = new IntegerTextBox() {... };
或
<u:IntegerTextBox/>
在我的.xaml
它还会覆盖我正在工作的环境 (Milestone Systems) 使用的默认样式。因此,我没有得到我应该得到的灰色文本框,而是得到了 Windows 默认白色文本框。
在 Microsoft 文档中,我找到了一个带有解释的类似示例,但我似乎无法真正找到使其工作的方法:override example
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
// Insert code to do custom painting.
// If you want to completely change the appearance of your control,
// do not call base.OnPaint(pe).
}
据我了解,它说:不要调用
base.OnTextChanged(e);
(在我的例子中)如果你不想改变控件的外观。我尝试删除它并得到相同的结果。
出现此问题的原因可能是新的 IntegerTextBox class 不使用基本 TextBox class 使用的样式。 请参考以下线程,其中已经讨论了类似的问题:
如果您不想重新设置 TextBox 的样式,那么您甚至不需要创建自定义 TextBox,您只需要 "Attached Property".
在您的项目中(UI 项目,如果它是 MVVM)创建一个 class 就像使用下面的内容:
public class TextBoxExtensions
{
public static readonly DependencyProperty OnlyNumbersAllowedProperty =
DependencyProperty.Register("OnlyNumbersAllowed", typeof(int), typeof(TextBoxExtensions), new PropertyMetadata(false,
(o, args) =>
{
// Assuring we are dealing with TextBox.
if (!(o is TextBox textField))
return;
// make sure TextBox contains characters.
if (textField.Text.Length == 0)
return;
// if TextBox only contains numbers then we are fine and don't go any further.
if (textField.Text.All(char.IsDigit)) return;
// A letter has been written in TextBox so that we remove it.
var result = textField.Text.Remove(textField.Text.Length - 1, 1);
textField.Text = result;
}));
public static bool GetOnlyNumberSupported(DependencyObject obj)
{
return (bool)obj.GetValue(OnlyNumbersAllowedProperty);
}
public static void SetOnlyNumberSupported(DependencyObject obj, bool value)
{
obj.SetValue(OnlyNumbersAllowedProperty, value);
}
}
现在您可以在视图中的任何位置(仅限文本框)使用它,如下所示:
local:TextBoxExtensions.OnlyNumbersAllowed="True"
提示:本地是项目中上述 class 位置的路径,可以通过 "xmlns".
声明为 App.xaml
中的 IntegerTextBox
定义隐式 Style
:
<Style TargetType="{x:Type local:IntegerTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
那么它应该继承当前应用于 <TextBox />
元素的任何隐式 Style
。