0

私の WPF C# プロジェクトでは、TreeView を作成しました。各 TreeViewItem には、項目がフォーカスを失ったときに発生する必要がある LostFocus イベントがあります。ユーザーが特定の TreeViewItem のヘッダーを変更したいときにクリックする必要があるボタンも作成しました。ユーザーは、TreeView で選択した後、ボタンをクリックすると、TreeViewItem ヘッダーを置き換える TextBox が表示されます。ユーザーが TextBox をクリックせずに別の TreeViewItem をクリックした場合、LostFocus イベントは発生しません。それ以外の場合、ユーザーが TextBox をクリックしてからフォーカスを変更すると、発生します。textBox.Focus()and も使用 しましKeyboard.Focus(textBox)たが、機能しません。どうすればこれを修正できますか?

明確にするために、投稿を作成する前に、別の SO answer hereを読みました

ここにスニペットコードがあります

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

1 に答える 1

3

申し訳ありませんが、あなたの質問を読んだすべての通常の WPF ユーザーは、おそらく同情して首を横に振っています。データ バインディング、テンプレート、およびトリガーを活用して、UI を従来の方法で動的にするのではなく、真の「Zen of WPF」をまだ学んでいないため、残念に思います。この能力があるからこそ、WPF は美しいのです。また、物事が「1000%」簡単になります。

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

あなたの問題に関する限り、あなたのLostFocus問題は複数のフォーカススコープがあることだと思います。

これを「WPFの方法」で行うことに関する追加の詳細

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

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

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

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

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

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

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

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

SetShowTextBox(item, false);

WPF達成したいことを簡単に実行できるように、パターンとプラクティスを学び、投資してみてください。

TreeViews で達成したいことを始めるのに役立つプロジェクトもあります。

サンプルプロジェクト

于 2014-04-11T16:51:14.770 に答える