Question

Dans mon WPF C# projet, j'ai créé un TreeView.Chaque TreeViewItem a un événement LostFocus qui doit être soulevé lors de l'élément a perdu son accent.J'ai aussi créer un bouton qui est nécessaire pour être activé lorsque l'utilisateur veut changer l'en-tête d'un certain TreeViewItem.L'utilisateur, après la sélection dans l'Arborescence, cliquez sur le bouton et une zone de texte apparaît remplacement de la TreeViewItem en-tête.Si l'utilisateur ne clique pas sur la zone de texte, mais cliquez sur un autre TreeViewItem, l'événement LostFocus n'est jamais soulevée.Sinon, si l'utilisateur cliquez sur zone de texte, puis changer d'orientation, il est soulevé.J'ai aussi utilisé textBox.Focus() et Keyboard.Focus(textBox) mais le ne travaillent pas.Comment puis-je résoudre ce problème?

Juste pour être clair, avant de créer un post que j'ai lu de l'autre AFIN de répondre à ici

Voici l'extrait de code

 private void RenameButton_Click(object sender, RoutedEventArgs e)
     {

         TreeViewItem twItemSelected = (TreeViewItem)this.Treeview_PropertyDefinition.SelectedItem;                                                            
         var textBox = new TextBox()
         {
             Text = (String)twItemSelected.Header,
         };
         textBox.Focus();
         Keyboard.Focus(textBox);
         if (textBox.IsFocused)
             MessageBox.Show("focused");


         twItemSelected.Header = textBox;            


         //check which property is currently selected

             String parentName = ((TreeViewItem)twItemSelected.Parent).Name;
          ((TreeViewItem)twItemSelected.Parent).Parent).Name;

            //get values from file 
            //show page based on parent value
             switch (parentName)
             {
                 case "RectangleBar_TreeviewItem":
                     textBox.LostFocus += (o, ev) =>
                     {...}  
    }
Était-ce utile?

La solution

Pardon pour mon dire, mais chaque utilisateur WPF qui a lu votre question a probablement secoué la tête dans la pitié.Nous nous sentons triste pour vous, parce que vous n'avez pas encore appris la véritable "Zen de WPF", ce qui est l'optimisation de la liaison de données, des modèles et des déclencheurs de votre INTERFACE utilisateur dynamique plutôt que de le faire à l'ancienne.WPF est belle à cause de cette capacité.Il fait aussi des choses "1000%" plus facile.

Je vous recommande de changer votre INTERFACE utilisateur d'utiliser un Déclencheur sur votre TreeViewItem pour remplacer votre HeaderTemplate basée sur une propriété que vous définissez dans la TreeViewItem.Définissez cette propriété à true lorsque l'élément est double-cliqué.Configurer faux quand IsKeyboardFocusWithin va false (vous pouvez remplacer les métadonnées et ajouter un PropertyChangedCallback pour cela).

En ce qui concerne votre LostFocus problème, je pensez que votre problème est que vous avez plusieurs focus étendues.

Plus de détails sur le "WPF façon"

Voici quelques détails sur la façon de mettre en œuvre cette utilisation d'une propriété attachée, des déclencheurs et des modèles.

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

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

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

Voici ce que votre style:

La propriété attachée "ShowTextBox" peuvent être créés dans MyWindowClass à l'aide de la "propa" snippet - il suffit de taper "propa" et cliquer sur l'onglet, puis de remplir les blancs.

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

SetShowTextBox(item, true);
To switch it back:

SetShowTextBox(item, false);

S'il vous plaît essayer de l'apprentissage et de l'investissement dans les habitudes et les pratiques de WPF de sorte qu'il sera facile de faire ce que vous voulez atteindre.

Il y a aussi des projets là-bas qui peut vous aider avec ce que vous voulez atteindre avec TreeViews.

Exemple de projet

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