我100%肯定我这样做是错误的,这个问题是“按设计”。
我想要一个Slider和一个显示其值的TextBox。用户可以使用Slider,也可以在TextBox中手动输入数字。
我还想利用TextChanging事件来忽略任何非数字条目。 TextChanged只有在用户输入内容后才会起作用,并且这不是一个更好的方案,KeyDown不会捕获其他输入方法,如墨水或语音。
所以我有这个:
<StackPanel>
<Slider x:Name="Size" Value="100" Maximum="100" Minimum="0" />
<TextBox x:Name="SizeText" Text="{Binding ElementName=Size,Path=Value,Mode=TwoWay}" TextChanging="SizeText_TextChanging" />
</StackPanel>
其中“SizeText_TextChanging”现在只是一个空代码块:
private void SizeText_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
// Nothing Here.
}
此代码构建,但在启动时,应用程序抛出JIT未处理的win32异常并关闭。
将TextChanging更改为TextChanged工作正常,但我再次希望TextChanging能够工作(或类似的东西)以提供更好的用户体验。
“模式”也没有效果。我尝试了所有三种不同的模式,都崩溃了。通过完全删除绑定并给出Text属性,任何值都可以正常工作。
我还认为将TextChanging事件处理程序设置为空是问题,所以我从here借用了以下代码,但应用程序仍然崩溃:
private void SizeText_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
if (!Regex.IsMatch(sender.Text, "^\\d*\\.?\\d*$") && sender.Text != "")
{
int pos = sender.SelectionStart - 1;
sender.Text = sender.Text.Remove(pos, 1);
sender.SelectionStart = pos;
}
}
像我说的那样,我可能正以错误的方式接近这一点。我刚开始学习UWP和C#所以我是一个总菜鸟。但是我已经阅读了关于TextChanging的所有内容,它只是简单地讨论了在TextChanging事件中呈现的值以及相关的注意事项。因此,虽然听起来应用程序被抛入循环尝试读取滑块的值并尝试查看TextChanging事件所说的内容,但我看不出如何修复它。请帮忙!
谢谢
答案 0 :(得分:2)
我不知道为什么会发生这种情况,但解决方法是仅在TextChanging
(或页面)加载后使用x:Bind而不是Binding注册SizeText
事件处理程序:
<强> XAML 强>
<TextBox x:Name="SizeText" Text="{x:Bind Size.Value, Mode=TwoWay}" Loaded="SizeText_Loaded"/>
<强> CS 强>
private void SizeText_Loaded(object sender, RoutedEventArgs e)
{
SizeText.TextChanging += SizeText_TextChanging;
}
private void SizeText_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
}
答案 1 :(得分:0)
我遇到同样的问题,但这个解决方案对我不起作用。 作为@Mushriq,我使用 _TextChanging()来忽略表单中的任何非数字条目。 但我的表单包含许多数字字段以及主要细节部分,其中包含其中2个字段。 问题是我第一次显示部件时输入 _Loaded ,而不是其他部件。当我显示现有零件时没有问题,但如果我添加一个新零件,我会得到异常。 有没有办法让解决方案适应我的情况?