Domanda

Ho un TreeView nidificato in cui mi legano l'evento doppio clic su ogni elemento in modo che il testo del nodo viene modificato in una casella di testo modificabile. Ho quindi utilizzare l'EventHandler LostFocus per rimuovere la casella di testo e ripristinare il testo.

  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 non sembra come l'evento LostFocus funziona correttamente. Quando clicco fuori della casella di testo, non sparare a tutti. Posso anche fare doppio clic su un altro nodo e va in modalità di modifica (cioè diventa una casella di testo), mentre il primo testo sembra avere ancora messa a fuoco. Perso attenzione non si attiva fino a che iniziano ad andare avanti e indietro tra due caselle di testo.

Sto usando VS2010 rc con il progetto impostato su Net 3.5.

È stato utile?

Soluzione

Oh mio! Perdonate la mia dirlo, ma ogni utente regolare WPF che ha letto la vostra domanda è probabilmente scossi la testa nella pietà. Ci sentiamo tristi per te perché non hai ancora imparato il vero "Zen di WPF", che sta sfruttando l'associazione di dati, modelli e attiva per rendere l'interfaccia utente dinamica, piuttosto che farlo la vecchia maniera. WPF è bello perché di questa capacità. Inoltre rende le cose "1000%" più facile.

Vi consiglio di cambiare l'interfaccia utente di utilizzare un trigger sulla vostra TreeViewItem per sostituire il vostro HeaderTemplate basato su una proprietà si definisce nel TreeViewItem. Impostare questa proprietà vero quando l'articolo è fatto doppio clic. Impostare è falsa quando IsKeyboardFocusWithin diventa falsa (è possibile ignorare i metadati e aggiungere un PropertyChangedCallback per questo).

Per quanto riguarda il problema LostFocus va, ho il sospetto che il tuo problema è che avete più ambiti di messa a fuoco o si tratta di un bug nella RC. Senza vedere il tuo XAML Non posso dire molto di più.

Ulteriori dettagli su questa operazione "via WPF"

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

I tuoi modelli possono essere semplice o complesso come si desidera. Ecco semplice:

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

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

Ecco cosa il vostro stile sarà simile:

<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 proprietà "ShowTextBox" allegato può essere creato in MyWindowClass utilizzando il frammento di "propa" -. Basta digitare "propa" e scheda colpito, poi riempire gli spazi vuoti

Per passare la voce per mostrare la casella di testo, basta:

SetShowTextBox(item, true);

Per tornare indietro:

SetShowTextBox(item, false);

Spero che questo aiuta.

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