Zone de texte.Événement TextChanged tir deux fois sur Windows Phone 7 émulateur
J'ai une question très simple application de test juste pour jouer avec Windows Phone 7. J'ai juste ajouté un TextBox
et un TextBlock
à l'INTERFACE standard du modèle. Le seul code personnalisé est la suivante:
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
private int counter = 0;
private void TextBoxChanged(object sender, TextChangedEventArgs e)
{
textBlock1.Text += "Text changed " + (counter++) + "\r\n";
}
}
La TextBox.TextChanged
événement est programmé pour TextBoxChanged
dans le code XAML:
<TextBox Height="72" HorizontalAlignment="Left" Margin="6,37,0,0"
Name="textBox1" Text="" VerticalAlignment="Top"
Width="460" TextChanged="TextBoxChanged" />
Cependant, chaque fois que j'appuie sur une touche lors de l'exécution de l'émulateur (soit le clavier à l'écran ou de la physique, après avoir appuyé sur Pause pour permettre à celle-ci), il incrémente le compteur deux fois, l'affichage de deux lignes dans le TextBlock
. Tout ce que j'ai essayé montre que l'événement est véritablement tir deux fois, et je n'ai aucune idée pourquoi. J'ai vérifié que c'est que d'être souscrit une fois - si je vous désabonner dans la MainPage
constructeur, il ne se passe rien du tout (pour le bloc de texte) lors de la modification du texte.
J'ai essayé le code équivalent dans une application Silverlight, et il n'a pas eu lieu là. Je n'ai pas un physique de téléphone de reproduire cela en ce moment. Je n'ai trouvé aucune mention d'un problème connu dans le Windows Phone 7.
Quelqu'un peut-il expliquer ce que je fais mal, ou dois-je déclarer ce qu'un bug?
EDIT: Pour réduire le risque étant d'avoir deux contrôles de texte, j'ai essayé de supprimer les TextBlock
complètement, et la modification de la TextBoxChanged méthode pour juste incrément counter
. J'ai ensuite exécuter dans l'émulateur, tapé 10 lettres et puis mettre un point d'arrêt sur la counter++;
ligne (juste pour se débarrasser de toute possibilité de rupture dans le débogueur est à l'origine de problèmes) et il montre counter
20.
EDIT: j'ai maintenant demandé dans le Windows Phone 7 forum... nous allons voir ce qui se passe.
- Juste par intérêt - si vous vérifiez à l'intérieur de l'événement, est le contenu de la zone de texte le même les deux fois, l'événement se déclenche? Je ne sais pas vraiment pourquoi cela arriverait, comme j'ai l'habitude d'utiliser MVVM et la liaison de données à la place de la gestion des événements de ces choses (Silverlight et WPF, pas beaucoup d'expérience avec WP7).
- Oui, je vois "l'après" le texte deux fois. Donc, si j'appuie sur "h" et l'affichage
textBox1.Text
dans le cadre de la textBlock1 outre, il affiche "h" dans les deux lignes. - Vous évoquez les 2 claviers, pourrait être un facteur? Vous pouvez les désactiver? Et peut-être vous pouvez vérifier si tous les membres de TextChangedEventArgs sont égaux dans les deux appels?
- La plupart du temps je n'ai pas pris la peine permettant le clavier physique... mais seulement pour voir si cela aurait un effet.
TextChangedEventArgs
n'a pas vraiment beaucoup disponibles juste leOriginalSource
, qui est toujours null. - Ce qui se passe lorsque vous définissez e.Manipulés = true?
TextChangedEventArgs
n'ont pas deHandled
propriété dans WP7 🙁- Il ressemble à un bug, il n'est pas lié au clavier parce que vous pouvez obtenir les mêmes résultats par simplement d'affecter une nouvelle valeur à la propriété Text, le TextChanged encore se déclenche deux fois.
- Êtes-vous en tapant avec deux claviers de nouveau?
- Soumettre un rapport de bogue sur WP7.
- A ce fixe dans la RTM?
- Ooh, je n'ai pas vérifié encore. Allons le faire aujourd'hui.
- Salut, Est-ce bogue fixe déjà à cette époque? Merci
- Je n'ai pas fait de Mangue de développement, de sorte qu'il peut être fixé là - mais je ne suis pas sûr.
- uhmm suppose que je dois vérifier :).. en passant merci pour le temps que sir..
- Dans mon windows phone 8 dispositif réel cela fonctionne bien.
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle le
TextChanged
événement se déclenche deux fois dans WP7 est un effet secondaire de la manière dont leTextBox
a été basé sur un modèle pour le Métro de regarder.Si vous modifiez le
TextBox
modèle dans le Mélange, vous verrez qu'il contient un secondaireTextBox
pour handicapés/état de lecture seule. Cela entraîne, comme un effet secondaire, l'évènement qui se déclenche deux fois.Vous pouvez modifier le modèle pour supprimer les
TextBox
(et des états associés) si vous n'avez pas besoin de ces états, ou de modifier le modèle pour obtenir un regard différent dans l'handicapé/état en lecture seule, sans l'aide d'un secondaireTextBox
.L'événement se déclenche qu'une seule fois.
j'irais pour le bug, principalement parce que si vous mettez le
KeyDown
etKeyUp
événements de là, il montre qu'ils sont tiré une seule fois (chacun d'eux), mais laTextBoxChanged
événement est déclenché deux foisTextInput
faire?" Je ne suis pas familier avecTextInput
...Qui ne sonne comme un bug pour moi. Comme solution de contournement, vous pouvez toujours utiliser Rx du
DistinctUntilChanged
. Il y a une surcharge qui permet de spécifier la clé distinctes.Cette extension de la méthode renvoie la observables événement TextChanged mais ignore consécutives doublons:
Une fois que le bug est corrigé, vous pouvez simplement supprimer le
DistinctUntilChanged
ligne.Sympa! J'ai trouvé cette question par la recherche d'un problème lié et a également constaté ce problème dans mon code. Double événement mange plus de ressources CPU dans mon cas. Donc, j'ai fixé mes temps réel filtre de zone de texte avec cette solution:
Je crois que cela a toujours été un bug dans le Compact Framework. Il doit avoir été exécutée sur WP7.
Que ca ressemble à un bug pour moi, si vous essayez de soulever un événement à chaque fois que le texte des modifications, vous pouvez essayer d'utiliser une liaison bidirectionnelle au lieu de cela, malheureusement cela ne peut pas élever par-touche, appuyez sur les événements de changement (seulement lorsque le champ perd le focus). Voici une solution de contournement si vous avez besoin d'un:
textBlock1.Text
en train de changer - je vais faire un essai si. (La solution de contournement I a été vais essayer de faire était de faire de mon gestionnaire dynamique, en rappelant que le texte précédent. Si elle n'a pas réellement changé, l'ignorer 🙂Avertissement - je ne suis pas familier avec xaml nuances et je sais que cela paraît illogique... mais de toute façon, ma première pensée est pour essayer de passer aussi simplement eventargs plutôt que textchangedeventargs. Ne fait pas de sens, mais peut-être qu'il pourrait aider? Il semble que lorsque j'ai vu le double de tirs comme ça avant qu'il soit dû à un bug ou à cause de quelque 2 ajouter un gestionnaire d'événements appels qui se passe derrière les coulisses... je ne suis pas sûr de bien?
Si vous avez besoin rapide et sale, encore une fois, moi de ne pas être connu avec xaml ma prochaine étape serait de simplement les ignorer xaml pour que la zone de texte comme une solution de rechange rapide... faire textbox totalement en c# pour l'instant jusqu'à ce que vous pouvez identifier le bug ou d'une délicate code... qui est, si vous avez besoin d'une solution temporaire.
Je ne pense pas que c'est un bug ..
Lorsque vous affectez la valeur d'une propriété de texte à l'intérieur de l'événement textchanged , la zone de texte valeur est modifiée, ce qui aura pour appeler le texte modifié de l'événement ..
essayez cette Application Windows Forms , vous pouvez obtenir une erreur
"Une exception non gérée du type 'System.StackOverflowException' s'est produite dans System.Windows.Forms.dll"
StefanWick est droit, envisager l'utilisation de ce modèle
C'est un vieux sujet, mais au lieu de changer de modèle (qui ne fonctionne pas pour moi, je ne vois pas l'autre zone de texte avec le Mélange) vous pouvez ajouter un booléen pour vérifier si l'événement a déjà fait la fonction ou pas.
Je suis conscient que c'est PAS la meilleure façon, mais je pense que c'est la manière la plus simple de le faire. Et il fonctionne.