Frage

In meinem WPF-C#-Projekt habe ich eine TreeView erstellt.Jedes TreeViewItem verfügt über ein LostFocus-Ereignis, das ausgelöst werden muss, wenn das Element seinen Fokus verliert.Ich habe auch eine Schaltfläche erstellt, auf die geklickt werden muss, wenn der Benutzer den Header eines bestimmten TreeViewItem ändern möchte.Der Benutzer kann nach der Auswahl in TreeView auf die Schaltfläche klicken und eine TextBox erscheint, die den TreeViewItem-Header ersetzt.Wenn der Benutzer nicht auf TextBox, sondern auf ein anderes TreeViewItem klickt, wird das LostFocus-Ereignis nie ausgelöst.Andernfalls wird es ausgelöst, wenn der Benutzer auf TextBox klickt und dann den Fokus ändert.Ich habe es auch verwendet textBox.Focus() Und Keyboard.Focus(textBox) aber die funktionieren nicht.Wie kann ich das beheben?

Um es klarzustellen: Bevor ich einen Beitrag verfasse, habe ich eine weitere SO-Antwort gelesen Hier

Hier ist der Snippet-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) =>
                     {...}  
    }
War es hilfreich?

Lösung

Verzeihen Sie, dass ich das sage, aber jeder normale WPF-Benutzer, der Ihre Frage gelesen hat, hat wahrscheinlich vor Mitleid den Kopf geschüttelt.Wir sind traurig für Sie, weil Sie den wahren „Zen von WPF“ noch nicht kennengelernt haben, der darin besteht, Datenbindung, Vorlagen und Trigger zu nutzen, um Ihre Benutzeroberfläche dynamisch zu gestalten, anstatt es auf die altmodische Art und Weise zu tun.WPF ist aufgrund dieser Fähigkeit großartig.Es macht die Dinge auch „1000 %“ einfacher.

Ich empfehle Ihnen, Ihre Benutzeroberfläche so zu ändern, dass ein Trigger für Ihr TreeViewItem verwendet wird, um Ihr HeaderTemplate basierend auf einer Eigenschaft zu ersetzen, die Sie im TreeViewItem definieren.Setzen Sie diese Eigenschaft auf „true“, wenn auf das Element doppelgeklickt wird.Setzen Sie es auf „false“, wenn „IsKeyboardFocusWithin“ auf „false“ geht (Sie können Metadaten überschreiben und dafür einen PropertyChangedCallback hinzufügen).

Soweit Ihr LostFocus Problem geht, ich vermute, dass Ihr Problem darin besteht, dass Sie mehrere Fokusbereiche haben.

Weitere Details zur Vorgehensweise auf „WPF-Art“

Hier finden Sie einige Details zur Implementierung mithilfe einer angehängten Eigenschaft, von Triggern und Vorlagen.

Ihre Vorlagen können so einfach oder so komplex sein, wie Sie möchten.Hier ist es einfach:

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

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

So würde Ihr Stil aussehen:

Die angehängte Eigenschaft „ShowTextBox“ kann in MyWindowClass mit dem „propa“-Snippet erstellt werden – geben Sie einfach „propa“ ein, drücken Sie die Tabulatortaste und füllen Sie dann die Lücken aus.

Um das Element so umzuschalten, dass das Textfeld angezeigt wird, gehen Sie einfach wie folgt vor:

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

SetShowTextBox(item, false);

Bitte versuchen Sie, die Muster und Praktiken von zu lernen und in sie zu investieren WPF damit es Ihnen leicht fällt, das zu erreichen, was Sie erreichen möchten.

Es gibt auch Projekte, die Ihnen den Einstieg in das ermöglichen, was Sie mit TreeViews erreichen möchten.

Beispielprojekt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top