WPF LOSTFOCUSは正しくVS2010ツリービューアイテムを発射ありません
-
20-09-2019 - |
質問
私は、ノードのテキストを編集可能なテキストボックスに変更されるように、私は、各項目にダブルクリックイベントをバインドし、ネストされたTreeView
を持っています。私は、テキストボックスを削除し、テキストを復元するためにLOSTFOCUSのEventHandlerのを使用しています。
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イベントが正常に機能しているようUnfortantlyそれはいないようです。私は、テキストボックスの外側をクリックすると、それは全く発生しません。最初のテキストボックスには、まだフォーカスを持っているように見える一方で(つまり、テキストボックスになる)私も別のノード上でダブルクリックすることができ、それが編集モードになります。私は2つのテキストボックスの間で前後に行くの開始それまでは発生しませんフォーカスを失いました。
私は3.5を.NETに設定されているプロジェクトでVS2010 RCを使用しています。
解決
私のああ!すみません、私はそう言って、しかし、あなたの質問を読んでいるすべての定期的なWPFのユーザーは、おそらく残念で自分の頭を振とうしました。あなたはまだ、データバインディング、テンプレートを活用し、むしろそれを昔ながらの方法を行うよりも、あなたのUIを動的にするためにトリガされ、真の「WPFの禅」を、学んでいないので、我々はあなたのために悲しく感じます。 WPFがあるため、この能力を美しいです。また、物事、 "1000%" は簡単になります。
私はあなたがツリービューアイテムで定義するプロパティに基づいて、あなたのHeaderTemplateを置き換えるために、あなたのツリービューアイテムの上にトリガを使用するようにUIを変更するお勧めします。アイテムをダブルクリックするとこのプロパティをTrueに設定します。 IsKeyboardFocusWithinが偽になったとき(あなたがメタデータを上書きして、このためにPropertyChangedCallbackを追加することができます)はfalseに設定します。
限り、あなたの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);
私はこのことができます願っています。