2010-10-11 138 views
3

嗨 我无法将重点放在控件的父项上。我有一个放置在画布上的控件。 如果我单击该控件,我需要在画布上设置焦点以处理一些键盘事件。 然而尽管我试图将焦点设置等,其连接到画布不火的是wpf设置焦点问题

protected override void OnPreviewMouseDown(MouseButtonEventArgs e) 
     { 
      base.OnPreviewMouseDown(e); 
      Canvas designer = VisualTreeHelper.GetParent(this) as Canvas; 
      designer.Focus() ;//this doesn't work 
      Keyboard.Focus(designer); //this also doesn't work 


     } 

键盘事件。

+1

如果您将base.OnPreviewMouseDown(e)在呼叫的其余部分之下调用,会发生什么? – 2010-10-11 15:17:01

回答

11

确保画布有FocusableIsEnabled都设置为true。没有这个,Focus()将会失败。来自Focus()文档:

要获得专注,Focusable和IsEnabled必须都是true。

此外,由于你在一个PreviewMouseDown事件这样做,你可能需要重新修改你的方法如下:

protected override void OnPreviewMouseDown(MouseButtonEventArgs e) 
{ 
    Canvas designer = VisualTreeHelper.GetParent(this) as Canvas; 
    designer.Focus() ;//this doesn't work 
    Keyboard.Focus(designer); //this also doesn't work 

    // Just in case something else is changing your focus as a result of a mouse event... 
    e.Handled = true; 
    base.OnPreviewMouseDown(e); 
} 
+0

我将这些属性设置为true,但我的事件仍然不会触发。我重写OnGotFocus方法来查看此事件是否触发并且OnGotFocus触发。但键盘事件不要 – george 2010-10-11 15:17:03

+0

@george:焦点()返回true? – 2010-10-11 15:17:21

+0

是的,它返回true – george 2010-10-11 15:17:56

-3

我使用My UserControl属性:Background =“Transparent”。

+6

你能否请[编辑]解释为什么这回答问题/它是如何工作的?仅限代码答案[阻止](http://meta.stackexchange.com/q/148272/274165),因为他们没有教导解决方案。 – 2015-10-23 02:55:17

+0

我不知道为什么。我在另一个问题中读到了这个。但我不记得在哪。 – wishmaster35 2015-10-23 22:22:47