gpt4 book ai didi

c# - 仅为 WPF 中禁用的文本框设置默认文本

转载 作者:行者123 更新时间:2023-12-05 09:27:14 27 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我需要仅为禁用的 TextBox 控件设置默认文本。即启用的控件可能包含空文本,但是当控件被禁用且文本为空时,应该显示绑定(bind)值,例如“没有数据”。

在 WPF 中有什么正确的方法可以做到这一点吗?

最佳答案

您可以使用这样的行为:

public enum DisplayDefaultTextMode
{
TextBoxTextEmpty,
TextBoxDisabledAndTextEmpty
}

public class DefaultTextBoxValueBehavior : Behavior<TextBox>
{
public DisplayDefaultTextMode DisplayMode { get; set; } = DisplayDefaultTextMode.TextBoxDisabledAndTextEmpty;

public string DefaultText
{
get => (string)GetValue(DefaultTextProperty);
set => SetValue(DefaultTextProperty, value);
}

public static readonly DependencyProperty DefaultTextProperty =
DependencyProperty.Register(
nameof(DefaultText),
typeof(string),
typeof(DefaultTextBoxValueBehavior),
new PropertyMetadata(string.Empty));

protected override void OnAttached()
{
base.OnAttached();

AssociatedObject.Loaded += OnLoaded;

AssociatedObject.TextChanged += OnTextChanged;
AssociatedObject.IsEnabledChanged += OnIsEnabledChanged;
}

protected override void OnDetaching()
{
base.OnDetaching();

AssociatedObject.Loaded -= OnLoaded;
AssociatedObject.TextChanged -= OnTextChanged;
AssociatedObject.IsEnabledChanged -= OnIsEnabledChanged;
}

private void OnLoaded(object sender, RoutedEventArgs e) => SetDefaultTextIfNeeded();

private void OnTextChanged(object sender, TextChangedEventArgs e)
{
if (AssociatedObject.Text?.Length == 0 && e.Changes.Any(c => c.RemovedLength > 0))
{
//ignore since we expect the user to cleare the field for futher input
}
else
SetDefaultTextIfNeeded();
}

private void OnIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) => SetDefaultTextIfNeeded();

private void SetDefaultTextIfNeeded()
{
if (CheckShouldSetDefaultText())
SetDefaultText();
}

private bool CheckShouldSetDefaultText()
{
if (DisplayMode == DisplayDefaultTextMode.TextBoxTextEmpty)
return string.IsNullOrEmpty(AssociatedObject.Text);
else
return string.IsNullOrEmpty(AssociatedObject.Text) && !AssociatedObject.IsEnabled;
}

private void SetDefaultText()
{
AssociatedObject.TextChanged -= OnTextChanged;
AssociatedObject.Text = DefaultText;
AssociatedObject.TextChanged += OnTextChanged;
}
}

使用示例:

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

<TextBox>
<i:Interaction.Behaviors>
<behaviors:DefaultTextBoxValueBehavior
DisplayMode="TextBoxDisabledAndTextEmpty"
DefaultText="Default text"/>
</i:Interaction.Behaviors>
</TextBox>

注意!您可以在行为中定义 DisplayMode 属性以设置默认文本外观。如果您设置 DisplayDefaultTextMode.TextBoxTextEmpty,如果 texbox 文本为 null 或为空,则将设置默认文本。如果您设置 DisplayDefaultTextMode.TextBoxDisabledAndTextEmpty,默认文本将仅设置为带有空文本的禁用文本框。

希望对您有所帮助。

关于c# - 仅为 WPF 中禁用的文本框设置默认文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72786384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com