2017-07-20 55 views
2

在WPF中,我想創建一個自定義工具提示,當它打開時,可以檢測到F1按鍵,讓用戶訪問更詳細的幫助文件。檢測WPF中的按鍵工具提示

對於可重用性,我的方法是創建一個UserControl作爲工具提示。控件將檢測到KeyDown事件,然後執行可綁定的Command

但實際上KeyDown事件從未出現過。也許工具提示不適用於鍵盤事件?我曾嘗試爲UserControl設置KeyDown事件,然後爲UserControl內的子控件設置,但沒有任何運氣。

這裏是用戶控件的(一個示例)與KeyDown事件:

<UserControl x:Class="HotKeyToolTip" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     KeyDown="UserControl_KeyDown"> 

下面是這種控制將如何被聲明作爲工具提示,在這種情況下的組合框的項的示例:

<ComboBox.ItemContainerStyle> 
        <Style> 
         <Setter Property="Control.ToolTip"> 
          <Setter.Value> 
           <local:HotKeyToolTip Focusable="True"/> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </ComboBox.ItemContainerStyle> 
+0

嘗試'PreviewKeyDown'代替,看看是否能觸發事件 –

+0

好主意,但'PreviewKeyDown'沒有出現改變的事情。我認爲Combobox在我的例子中仍然是重點 - 按下正確的字母將在所選項目之間切換。 – Tekito

回答

0

很難在ToolTip/UserControl中處理KeyDown,因爲如果ToolTip將獲得焦點,則組合框將會鬆開它,因此將關閉下拉和工具提示。你可以看看How to intercept all the keyboard events and prevent losing focus in a WinForms application?

我會在Combobox中處理KeyDown並獲取/設置工具提示文本。爲了更多的靈活性,我會把它作爲一種行爲來實現!

 <ComboBox.ItemContainerStyle> 
      <Style TargetType="Control"> 
       <Setter Property="Control.ToolTip"> 
        <Setter.Value> 
         <ToolTip> 
          <local:HotKeyToolTip /> 
         </ToolTip> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ComboBox.ItemContainerStyle> 


private void ComboBox_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key==Key.F1) 
      { 
       var cmb = sender as ComboBox; 
       var cmbi = cmb.Items.OfType<ComboBoxItem>().ToList(); 
       if (cmbi != null) 
       { 
        foreach (var item in cmbi) 
        { 
         var tt = item.ToolTip as ToolTip; 
         if (tt != null && tt.IsOpen && tt.PlacementTarget == item) 
         { 
          (tt.Content as HotKeyToolTip).YourToolTipText = item.Content.ToString();//item.DataContext.ToolTipExtendedText 
         } 
        } 
       } 
      } 
     } 
+0

這很有道理,而且在我嘗試捕捉'tooltip'中的'keydown'之前,我正在做的事情。我更進一步,將'ToolTip.IsOpen'綁定到我的視圖模型,但即使這樣做也不是扣籃。 – Tekito