UWP:Binding + TextChanging = JIT win32异常

时间:2016-10-14 13:12:42

标签: c# visual-studio xaml uwp

我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事件所说的内容,但我看不出如何修复它。请帮忙!

谢谢

2 个答案:

答案 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 ,而不是其他部件。当我显示现有零件时没有问题,但如果我添加一个新零件,我会得到异常。 有没有办法让解决方案适应我的情况?