Domanda

Nel mio progetto WPF C #, ho creato una visione TreeView.Ogni TreeViewItem ha un evento LostFocus che deve essere sollevato quando l'articolo ha perso la messa a fuoco. Ho anche creato un pulsante che è necessario per essere cliccato quando l'utente vuole cambiare intestazione di un certo albero ViewItem. Utente, dopo la selezione in TreeView, puoi fare clic sul pulsante sul pulsante e una casella di testo appaiono sostituire l'intestazione TreeViewItem. Se l'utente non fa clic su TextBox ma fai clic su un altro albero VideoTem, l'evento LostFocus non viene mai sollevato.In caso contrario, se l'utente fai clic su TextBox e quindi modificare la messa a fuoco, viene sollevata. Ho anche usato textBox.Focus() e Keyboard.Focus(textBox) ma il non funziona. Come posso risolvere questo?

Solo per essere chiaro, prima di creare un post che ho letto un altro quindi rispondi qui

Ecco il codice Snippet

 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) =>
                     {...}  
    }
.

È stato utile?

Soluzione

Perdona il mio detto, ma ogni normale utente del WPF che ha letto la tua domanda ha probabilmente scosso la testa in pietà. Ci sentiamo tristi perché non hai ancora imparato il vero "ZEN di WPF", che sta sfruttando rilegatura dei dati, modelli e trigger per rendere la tua Ui dinamica piuttosto che farlo il modo vecchio stile. WPF è bello a causa di questa abilità. Rende anche le cose "1000%" più facili.

Ti consiglio di modificare il tuo interfaccia utente per utilizzare un trigger sul tuo TreeViewItem per sostituire il tuo HeaderTemplate in base a una proprietà che definisci in TreeViewItem. Imposta questa proprietà TRUE quando l'articolo è doppio cliccato. Impostalo falso quando iskyboardfocuswithin diventa falso (è possibile ignorare i metadati e aggiungere un immobile per questo).

Per quanto riguarda il problema del tuo LostFocus, sospetto che il tuo problema sia che tu abbia più ambiti di messa a fuoco.

Dettagli aggiuntivi sul fare questo il "wpf way"

Ecco alcuni dei dettagli su come implementare questo utilizzando una proprietà, trigger e modelli collegati.

I tuoi modelli possono essere semplici o complessi come vuoi. Ecco il semplice:

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

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

Ecco come sarebbe il tuo stile:

. La proprietà collegata "ShowTextBox" può essere creata in MyWindowClass utilizzando lo snippet "Propa" - basta digitare "propa" e premere scheda, quindi compilare gli spazi vuoti.

Per cambiare l'elemento per mostrare la casella di testo, solo:

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

SetShowTextBox(item, false);
.

Prova a imparare e investire nei modelli e nelle pratiche di WPF in modo che sarà facile fare ciò che vuoi ottenere.

Ci sono anche progetti là fuori che possono aiutarti a iniziare con quello che vuoi ottenere con TreeViews.

Progetto di esempio

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top