我正在使用Extended WPF Toolkit中的ColorPicker
控件,但有一些限制,因为我希望用户只启用ColorCanvas
。
<xctk:ColorPicker Focusable="False" ColorMode="ColorCanvas"
ShowAdvancedButton="False" ShowDropDownButton="False"
ShowAvailableColors="False" SelectedColor="{Binding CustomAccentColor}"
ShowRecentColors="False" ShowStandardColors="False" />
单击ToggleButton
时会显示画布,用户可以选择他想要的颜色。但是,当在画布外部单击时,按预期关闭。
现在的问题是,按空格键时,画布会再次打开。在应用程序中,重要的是除了包含Window
之外的任何内容都可以具有焦点,因此可以将空格键按下路由到特定命令。
我已经尝试设置Focusable="False"
,绑定到LostFocus
- 事件,并将焦点设置在代码隐藏窗口中,但没有任何效果。事件回调从未被击中。
我也尝试了SelectedColorChanged
- 事件,但这也没有用。
如何将焦点从ColorPicker
强制转回Window
?
答案 0 :(得分:0)
您可能会发现LostFocus甚至正在一个实际上具有焦点的较低控件上处理,因此您没有看到它。您可以做的是挂钩到PreviewKeyDown事件,并在检查中添加以下内容以查找要抑制的任何键:
private void ColorPicker_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space)
{
e.Handled = true;
ColorPicker1.IsOpen = true;
}
}
这将通过阻止它接收KeyDown事件来覆盖ColorPicker控件中处理的行为。您还可以使用以下内容移动焦点:
private void ColorPicker_GotFocus(object sender, RoutedEventArgs e)
{
ColorPicker1.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
}
这将确保鼠标单击将焦点移回上一个焦点控制。它并没有阻止和无限循环,所以要确保它不会集中回自身!
最后,您可能还希望将IsTabStop和IsKeyboardFocus设置为false,以防止如果您不希望它具有焦点或被选中,则可以选择标记到颜色选择器。
注意: 我在这里使用命名控件,但您应该能够通过发件人获得有问题的控件。