WPF Toolkit ColorPicker删除焦点

时间:2015-12-08 11:54:23

标签: c# wpf wpftoolkit

我正在使用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

1 个答案:

答案 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,以防止如果您不希望它具有焦点或被选中,则可以选择标记到颜色选择器。

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