質問

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

ただ明確にするために、投稿を作成する前にもう一つのことを読んだので答えるここ

ここにスニペットコード

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

役に立ちましたか?

解決

私の言っているのを許して、あなたの質問を読んだすべての通常のWPFユーザーはおそらく彼らの頭を残念に振っています。あなたがまだあなたのためにあなたのためにあなたのために悲しいことを感じています。この能力のために、WPFは美しいです。それはまた物事を「1000%」より簡単にします。

TreeViewItemにSeaderTemplateを置き換えるには、TreeViewItemであなたのヘッドテンプレートを置き換えるようにUIを変更することをお勧めします。アイテムがダブルクリックされたときにこのプロパティがtrueに設定します。 IskeyboardFocusWithinがfalseになると、それをfalseに設定します(メタデータをオーバーライドし、これにPropertyChangedCallbackを追加することができます)。

あなたのLostFocusの問題が発生する限り、私はあなたの問題があなたが複数のフォーカススコープを持っているということを疑っています。

この「WPFウェイ」

の詳細について

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

あなたのテンプレートはあなたが望むのと同じくらい簡単であるか複雑なものにすることができます。これが簡単です:

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

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

これはあなたのスタイルがどのように見えるものです:

添付のプロパティ "ShowTextBox"は、 "Propa"スニペットを使用してmyWindowClassで作成できます。

項目を切り替えるTextBoxの表示、

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

SetShowTextBox(item, false);
.

WPFのパターンやプラクティスを学習して投資してみてください。

あなたがTreeViewsで達成したいものを始めるのを助けることができるプロジェクトもあります。

サンプルプロジェクト

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top