Question

J'ai un TreeView imbriquée où je lie l'événement double-clic sur chaque élément afin que le texte du nœud est modifié à une zone de texte modifiable. J'utilise alors le eventhandler de LOSTFOCUS pour enlever la zone de texte et restaurer le texte.

  void treeViewItemWithMenu_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (selected == e.Source)
        {
            TextBox tb = new TextBox();
            tb.Text = this.Header.ToString();
            tb.Focus();
            tb.LostFocus += new RoutedEventHandler(tb_LostFocus);
            this.Header = tb;
            var a = e.OriginalSource;
            e.Handled = true;
        }
    }


    void tb_LostFocus(object sender, RoutedEventArgs e)
    {
        this.Header = ((TextBox)(this.Header)).Text;
    }

Unfortantly il ne semble pas que l'événement LostFocus fonctionne correctement. Lorsque je clique en dehors de la zone de texte, il ne se déclenche pas du tout. Je peux même sur un autre nœud double-cliquez et il passe en mode d'édition (ie devient une zone de texte) alors que la première zone de texte semble avoir encore mise au point. perdu le focus ne se déclenche pas jusqu'à ce que je commence à aller et venir entre les deux zones de texte.

J'utilise VS2010 rc avec le projet défini sur .Net 3.5.

Était-ce utile?

La solution

Oh mon dieu! Pardonnez mon dire, mais chaque utilisateur régulier WPF qui a lu votre question a probablement secoué la tête en pitié. Nous sommes tristes pour vous parce que vous ne l'avez pas encore appris le vrai « Zen de WPF », qui tire parti de la liaison de données, modèles et déclenche pour rendre votre interface utilisateur dynamique plutôt que de le faire de la manière ancienne. WPF est belle à cause de cette capacité. Il fait aussi des choses "1000%" plus facile.

Je vous recommande de changer votre interface utilisateur à utiliser un déclencheur sur votre TreeViewItem pour remplacer votre HeaderTemplate basé sur une propriété que vous définissez dans la TreeViewItem. Définissez cette propriété vrai lorsque l'article est un double-clic. Réglez-faux quand IsKeyboardFocusWithin devient fausse (vous pouvez remplacer les métadonnées et ajouter un PropertyChangedCallback pour cela).

En ce qui concerne votre problème de LostFocus va, je soupçonne que votre problème est que vous avez plusieurs champs d'application de mise au point ou il est un bogue dans le RC. Sans voir votre XAML Je ne peux pas dire beaucoup plus que cela.

Des détails supplémentaires sur le faire la "voie" WPF

Voici quelques-uns des détails sur la façon de mettre en œuvre cette propriété en utilisant un joint, les déclencheurs et les modèles.

Vos modèles peuvent être aussi simple ou aussi complexe que vous le souhaitez. Voici simple:

<DataTemplate x:Key="NormalTemplate">
  <ContentPresenter />
</DataTemplate>

<DataTemplate x:Key="TextBoxTemplate">
  <TextBox Text="{Binding}" />
</DataTemplate>

Voici ce que votre style ressemblerait à ceci:

<Style TargetType="TreeViewItem">
  <Setter Property="HeaderTemplate" Value="{StaticResource NormalTemplate}" />
  <Trigger Property="local:MyWindowClass.ShowTextBox" Value="true">
    <Setter Property="HeaderTemplate" Value="{StaticResource TextBoxTemplate}" />
  </Trigger>
</Style>

La propriété ci-joint « ShowTextBox » peut être créée en utilisant l'extrait MyWindowClass « propa » -. Il suffit de taper « PROPA » et cliquez sur l'onglet, puis remplissez les blancs

Pour passer l'élément pour afficher la zone de texte, juste:

SetShowTextBox(item, true);

Pour rétablissez:

SetShowTextBox(item, false);

J'espère que cette aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top