2016-10-14 2 views
1

Ich bin 100% sicher, dass ich das falsch mache und dieses Problem ist "von Design".UWP: Binding + TextChanging = JIT win32 Ausnahme

Ich möchte einen Schieberegler und eine TextBox, die ihren Wert anzeigt. Der Benutzer kann entweder den Slider verwenden oder manuell eine Zahl in die TextBox eingeben.

Ich wollte auch das TextChanging-Ereignis nutzen, um nicht numerische Einträge zu ignorieren. TextChanged würde nur funktionieren, nachdem ein Benutzer etwas eingegeben hat, und dies ist kein bevorzugtes Szenario, und KeyDown würde andere Eingabemethoden wie Tinte oder Sprache nicht erfassen.

So habe ich dies:

<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> 

Wo "SizeText_TextChanging" ist einfach ein leerer Block von Code jetzt:

private void SizeText_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) 
    { 
     // Nothing Here. 
    } 

Dieser Code erstellt, aber beim Start der App wirft einen JIT unhandled win32 Ausnahme und schließt.

Ändern von TextChanging zu TextChanged funktioniert gut, aber wieder bevorzuge ich TextChanging zu arbeiten (oder etwas Ähnliches), um eine bessere Benutzererfahrung zu geben.

"Modus" hat auch keine Wirkung. Ich habe alle drei verschiedenen Modi ausprobiert, alle stürzen ab. Wenn Sie die Bindung vollständig entfernen und der Text-Eigenschaft einen beliebigen Wert zuweisen, funktioniert dies einwandfrei.

Ich dachte auch, dass vielleicht die Event-Handler leer ist das Problem TextChanging mit, so dass ich lieh unter dem Code aus here aber die App stürzt nach wie vor:

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; 
    } 
} 

Wie ich schon sagte, ich wahrscheinlich der am Annäherung an den Falsche Weg. Ich fange gerade an, UWP und C# zu lernen, also bin ich ein totaler Noob. Aber ich habe alles gelesen, was ich über TextChanging wissen konnte, und es geht einfach darum, den Wert und die damit verbundenen Vorsichtsmaßregeln zu rendern, was nicht innerhalb des TextChanging-Ereignisses zu schreiben ist. Während es sich anhört, als würde die App in eine Schleife geworfen werden, die versucht, den Wert des Schiebereglers zu lesen und zu sehen, was das TextChanging-Ereignis sagt, sehe ich nicht, wie ich es beheben kann. Bitte helfen Sie!

Danke

Antwort

2

Ich weiß nicht, warum dies geschieht, aber eine Abhilfe ist die TextChanging Ereignishandler nur einmal SizeText (oder die Seite) registrieren geladen und mit x: Binden statt Bindung:

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) 
{ 
} 
+0

Leider hat das nicht funktioniert. Es gab mir das gleiche Problem. Das Auskommentieren der Event-Handler-Registrierung in SizeText_Loaded funktioniert so, als ob es das Problem noch weitergibt. – Mushriq

+0

Perfekt! Dies funktionierte mit x: Bind. Ich bin immer noch verwirrt, warum dieses Verhalten passiert (x: Bind und TextChanging funktionierte auch nicht, aber Ihr Vorschlag, das Loaded-Ereignis zuerst zu verwenden). Ich weiß, dass ich viel zu lernen habe. Danke noch einmal! – Mushriq

0

Ich habe das gleiche Problem, aber diese Lösung funktioniert nicht für mich. Als @Mushriq verwende ich _TextChanging(), um nicht numerische Einträge in einem Formular zu ignorieren. Aber mein Formular enthält viele numerische Felder und auch einen Master-Detail-Teil, der 2 dieser Felder enthält. Das Problem ist, dass ich in der _Loaded das erste Mal eingeben, dass ich ein Teil anzeigen, aber nicht für die anderen Teile. Wenn ich existierende Teile zeige, gibt es kein Problem, aber wenn ich ein neues Teil hinzufüge, bekomme ich die Ausnahme. Gibt es eine Möglichkeit, die Lösung an meinen Fall anzupassen?

Verwandte Themen