gpt4 book ai didi

wpf - WPF 中 TextBox.Text 属性的奇怪情况

转载 作者:行者123 更新时间:2023-12-02 02:31:25 25 4
gpt4 key购买 nike

这个让我难住了。我找到了一些 code posted by Ray Burns 来为 TextBox 创建一个 DependencyProperty,它允许您限制用户可以删除哪些字符。我对其进行了一些修改以限制可以插入的字符,并使用它来创建仅接受数字输入(加上小数点)的文本框。

这对于通过键盘输入文本、粘贴、拖放等非常有效。唯一的问题是通过代码设置文本。它允许输入非数字文本,这本身并不是真正的问题。问题是,如果您在执行此操作后检查 TextBox 的 Text 属性的值,它会说它是一个空字符串。

这里有一些代码可以证明我的意思。一个简单的 WPF 窗口:

<Window x:Class="TestApp.Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:TestApp"
Title="Test" Height="125" Width="200">
<Canvas>
<TextBox x:Name="txtTest" Canvas.Left="10" Canvas.Top="10" Width="100" my:TextBoxRestriction.RestrictInsertTo=".0123456789"></TextBox>
<Button Canvas.Left="10" Canvas.Top="40" Click="Button_Click">Enter Text</Button>
<Button Canvas.Left="75" Canvas.Top="40" Click="Button_Click_1">Check Value</Button>
</Canvas>
</Window>

它的代码隐藏:

using System;
using System.Windows;

namespace TestApp
{
public partial class Test : Window
{
public Test()
{
InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
txtTest.Text = "Test";
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
MessageBox.Show(txtTest.Text, "Length = " + txtTest.Text.Length.ToString());
}
}
}

还有我对 Ray 类的修改:

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace TestApp
{
//Based on code by Ray Burns at https://stackoverflow.com/questions/3051590/how-to-track-which-character-is-deleted-in-textbox-in-wpf/3056168#3056168.
public class TextBoxRestriction : DependencyObject
{
//RestrictInsertTo: Set this to the characters that may be inserted.
public static string GetRestrictInsertTo(DependencyObject obj)
{
return (string)obj.GetValue(RestrictInsertToProperty);
}

public static void SetRestrictInsertTo(DependencyObject obj, string value)
{
obj.SetValue(RestrictInsertToProperty, value);
}

public static readonly DependencyProperty RestrictInsertToProperty = DependencyProperty.RegisterAttached("RestrictInsertTo", typeof(string), typeof(TextBoxRestriction), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
var box = (TextBox)obj;

box.TextChanged += (obj2, changeEvent) =>
{
var oldText = GetUnrestrictedText(box);
var allowedChars = GetRestrictInsertTo(box);

if (box.Text == oldText || allowedChars == null) return;

foreach (var change in changeEvent.Changes)
{
if (change.AddedLength > 0)
{
string added = box.Text.Substring(change.Offset, change.AddedLength);

if (added.Any(ch => !allowedChars.Contains(ch)))
{
var ss = box.SelectionStart;
var sl = box.SelectionLength;

box.Text = oldText;
box.SelectionStart = ss;
box.SelectionLength = sl;
}
}
}

SetUnrestrictedText(box, box.Text);
};
}
});

//UnrestrictedText: Bind or access this property to update the Text property bypassing all restrictions.
public static string GetUnrestrictedText(DependencyObject obj)
{
return (string)obj.GetValue(UnrestrictedTextProperty);
}

public static void SetUnrestrictedText(DependencyObject obj, string value)
{
obj.SetValue(UnrestrictedTextProperty, value);
}

public static readonly DependencyProperty UnrestrictedTextProperty = DependencyProperty.RegisterAttached("UnrestrictedText", typeof(string), typeof(TextBoxRestriction), new PropertyMetadata
{
DefaultValue = "",
PropertyChangedCallback = (obj, e) =>
{
var box = (TextBox)obj;

box.Text = (string)e.NewValue;
}
});
}
}

如果您尝试在 TextBox 中键入内容,您会发现它的工作方式与预期的差不多,并且单击 Check Value 按钮准确地反射(reflect)了文本;但是,如果您单击“输入文本”按钮,然后单击“检查值”按钮,您将看到该应用认为 TextBox 的 Text 属性是一个空字符串(即使它的文本在 UI 中清晰可见)。如果您以任何方式修改 UI 中的文本(例如,删除一个字符),然后单击检查值,它现在可以识别正确的文本。

谁能解释为什么会这样?我可能遗漏了一些显而易见的东西,但我似乎无法弄明白。

提前致谢!

杰夫

最佳答案

你还需要做一个 obj.SetValue(TextProperty, value)在你的 SetUnrestrictedText方法,我认为。

<罢工>

这是第一个猜测。如果不是这样并且没有其他人回复,我会更深入地调查一下。

我在我的机器 VS2010、.NET 4 上尝试使用您的示例代码执行此操作。附加属性重置了 TextBox每次的 Text 属性。我尝试了几种无效输入的变体。

如果您想要 DependencyObject 过滤掉代码中的赋值,拒绝无效字符并保留有效字符,那么您需要与 if (added.Any(ch => !allowedChars.Contains(ch))) 不同的测试.

关于wpf - WPF 中 TextBox.Text 属性的奇怪情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672380/

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