在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>
答案 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
}
}
}
}
}