Frage

Ich habe eine verschachtelte TreeView, wo ich das Doppelklick-Ereignis für jedes Element binden, so dass der Text des Knotens in ein editierbares Textfeld geändert wird. Ich benutze dann das Lost-Focus-Eventhandler das Textfeld zu entfernen und den Text wiederherzustellen.

  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 scheint es nicht, wie das Lostfocus-Ereignis korrekt funktioniert. Wenn ich außerhalb der Textbox klicken, wird es überhaupt nicht schießen. Ich kann auch einen Doppelklick auf einen anderen Knoten, und es geht in den Bearbeitungsmodus (dh wird ein Textfeld), während die erste Textbox scheint Fokus noch haben. Fokus verloren wird nicht ausgelöst, bis ich hin und her zwischen zwei Textfelder auf Start.

Ich verwende VS2010 rc mit Projektsatz 3,5 bis .net.

War es hilfreich?

Lösung

Oh my! Pardon mein sagen so, aber jeder normale WPF Benutzer, der Ihre Frage hat gelesen hat wahrscheinlich ihren Kopf in Mitleid geschüttelt. Wir fühlen uns für Sie traurig, weil Sie noch nicht das wahre „Zen von WPF“ gelernt, die Datenbindung, Vorlagen und Trigger nutzt, um die Benutzeroberfläche dynamisch zu machen, anstatt es auf die altmodische Art und Weise zu tun. WPF ist schön, weil diese Fähigkeit. Es macht auch Dinge "1000%" leichter.

Ich empfehle Ihnen, Ihre UI ändern, um einen Trigger auf Ihrem TreeViewItem zu benutzen, um Ihre Header zu ersetzen, basierend auf einer Eigenschaft, die Sie in der TreeViewItem definieren. Legen Sie diese Eigenschaft wahr, wenn das Element doppelgeklickt. Stellen Sie es falsch, wenn IsKeyboardFocusWithin falsch geht (Sie können Metadaten außer Kraft setzen und fügen Sie einen PropertyChangedCallback für diese).

Was Ihre Lost-Focus-Problem geht, ich vermuten, dass Ihr Problem ist, dass Sie mehrere Brennpunkte Bereiche haben, oder es ist ein Fehler in der RC. Ohne zu sehen, sagen Sie Ihre XAML Ich kann nicht viel mehr als das.

Weitere Einzelheiten zu tun dies den "WPF Weg"

Hier sind einige der Details, wie dies zu implementieren, um eine angefügte Eigenschaft, Trigger und Vorlagen.

Ihre Vorlagen können so einfach sein oder so komplex wie Sie wollen. Hier ist einfach:

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

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

Hier ist, was Ihr Stil aussehen würde:

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

Die beigefügte Eigenschaft "ShowTextBox" kann in MyWindowClass mit dem "Propa" Snippet erstellt werden. - einfach "Propa" und drücken Sie Tab, dann in den Lücken füllen

das Element wechseln das Textfeld zu zeigen, nur:

SetShowTextBox(item, true);

Um es zurückschalten:

SetShowTextBox(item, false);

Ich hoffe, das hilft.

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