我使用扩展WPF工具包中的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
?
这对我有效:
private void Selected_Color_Changed(object sender, RoutedPropertyChangedEventArgs<Color?> e)
{
YourRichTextControlElement.Focus();
Xceed.Wpf.Toolkit.ColorPicker colorPicker = sender as Xceed.Wpf.Toolkit.ColorPicker;
colorPicker.IsOpen = false;
}
您可能会发现,LostFocus甚至是在一个实际有焦点的较低控件上处理的,因此您看不到它。您可以做的是挂接到PreviewKeyDown事件中,并在检查中添加以下内容,以检查您想要抑制的任何键:
private void ColorPicker_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space)
{
e.Handled = true;
ColorPicker1.IsOpen = true;
}
}
这将通过阻止ColorPicker控件接收KeyDown事件来覆盖该控件中处理的行为。你也可以使用类似的东西移动焦点:
private void ColorPicker_GotFocus(object sender, RoutedEventArgs e)
{
ColorPicker1.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
}
这将确保鼠标单击将焦点移回上一个焦点控件。它并不能阻止无休止的循环,所以要确保它不会把注意力集中在自己身上!
最后,如果您不希望有焦点或被选项卡插入,您可能还希望将IsTabStop和IsKeyboardFocus设置为false,以防止选项卡插入颜色选择器。
注意:我在这里使用一个命名控件,但您应该能够通过发件人获得有问题的控件