2

TreeViewノードのテキストが編集可能なテキストボックスに変更されるように、各アイテムのダブルクリックイベントをバインドするネストがあります。次に、lostFocusイベントハンドラーを使用してテキストボックスを削除し、テキストを復元します。

  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;
    }

残念ながら、lostFocusイベントが正しく機能しているようには見えません。テキストボックスの外側をクリックしても、まったく起動しません。別のノードをダブルクリックすることもできます。最初のテキストボックスにフォーカスがあるように見えますが、編集モードになります(つまり、テキストボックスになります)。2つのテキストボックス間を行き来し始めるまで、フォーカスの喪失は発生しません。

プロジェクトを.net3.5に設定してvs2010rcを使用しています。

4

1 に答える 1

1

ああ、私の!私の言うことを許してください。しかし、あなたの質問を読んだすべての通常のWPFユーザーは、おそらく同情して首を横に振っています。昔ながらの方法ではなく、データバインディング、テンプレート、トリガーを活用してUIを動的にする、真の「Zen of WPF」をまだ学習していないので、残念に思います。この機能により、WPFは美しいです。また、「1000%」簡単になります。

TreeViewItemで定義したプロパティに基づいてHeaderTemplateを置き換えるために、TreeViewItemでトリガーを使用するようにUIを変更することをお勧めします。アイテムをダブルクリックしたときに、このプロパティをtrueに設定します。IsKeyboardFocusWithinがfalseになる場合は、falseに設定します(メタデータをオーバーライドして、このためにPropertyChangedCallbackを追加できます)。

LostFocusの問題に関する限り、問題は複数のフォーカススコープがあるか、RCのバグであると思われます。あなたのXAMLを見ずに、私はそれ以上のことを言うことはできません。

これを「WPFの方法」で行うための追加の詳細

添付のプロパティ、トリガー、テンプレートを使用してこれを実装する方法の詳細を次に示します。

テンプレートは、必要に応じて単純または複雑にすることができます。簡単です:

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

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

あなたのスタイルは次のようになります。

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

添付プロパティ「ShowTextBox」は、「propa」スニペットを使用してMyWindowClassで作成できます。「propa」と入力してタブを押し、空欄に入力するだけです。

アイテムを切り替えてテキストボックスを表示するには、次のようにします。

SetShowTextBox(item, true);

元に戻すには:

SetShowTextBox(item, false);

これがお役に立てば幸いです。

于 2010-02-17T02:29:18.077 に答える