在WPF工具提示中检测按键

时间:2017-07-20 20:05:35

标签: wpf user-controls tooltip

在WPF中,我想创建一个自定义工具提示,当打开时,可以检测F1按键,以便用户获取更详细的帮助文件。

对于可重用性,我的方法是创建一个UserControl作为工具提示。控件将检测KeyDown事件,然后执行可绑定的Command

但在实践中,KeyDown事件似乎永远不会发生。也许工具提示不能用于键盘事件?我尝试为KeyDown设置UserControl事件,然后为UserControl内的子控件设置,无论如何都没有运气。

以下是带有KeyDown事件的UserControl的(一个示例):

<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>

1 个答案:

答案 0 :(得分: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
                        }
                    }
                }
            }
        }