簡體   English   中英

沒有為 TreeViewItem 引發 LostFocus

[英]LostFocus not raised for a TreeViewItem

在我的 WPF C# 項目中,我創建了一個 TreeView。 每個 TreeViewItem 都有一個 LostFocus 事件,當項目失去焦點時必須引發該事件。 我還創建了一個按鈕,當用戶想要更改某個 TreeViewItem 的標題時需要單擊該按鈕。 用戶在 TreeView 中選擇后,可以單擊按鈕並出現一個 TextBox 替換 TreeViewItem 標題。 如果用戶沒有單擊 TextBox,而是單擊另一個 TreeViewItem,則永遠不會引發 LostFocus 事件。 否則,如果用戶單擊 TextBox 然后更改焦點,則會引發它。 我也使用textBox.Focus()Keyboard.Focus(textBox)但不起作用。 我怎樣才能解決這個問題?

為了清楚起見,在創建帖子之前,我在這里閱讀了另一個 SO 答案

這是片段代碼

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

我建議您更改 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>

以下是您的風格:

可以使用“propa”片段在 MyWindowClass 中創建附加屬性“ShowTextBox” - 只需鍵入“propa”並點擊選項卡,然后填寫空白。

要切換項目以顯示文本框,只需:

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

SetShowTextBox(item, false);

請嘗試學習和投資於WPF的模式和實踐,以便輕松實現您想要實現的目標。

還有一些項目可以幫助您開始使用 TreeViews 實現的目標。

示例項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM