WPF Toolkit颜色选择器删除焦点

本文关键字:删除 焦点 选择器 颜色 Toolkit WPF | 更新日期: 2023-09-27 18:26:10

我使用扩展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

WPF Toolkit颜色选择器删除焦点

这对我有效:

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,以防止选项卡插入颜色选择器。

注意:我在这里使用一个命名控件,但您应该能够通过发件人获得有问题的控件