2011-03-16 54 views
0

我有一个自定义类(ItemsContainer),其中包含几个按钮& UserControls。WPF MouseWheel和KeyDown没有输入焦点没有调用?

我正在实现一个使用鼠标&输入的导航系统,用户可以'平移'使用右键单击...但除非用户点击某些交互式(按钮等),我的方法为'mousewheel'和'keydown'不叫。

到目前为止我发现的最好的文章说我需要'钩'自己在每一个控制!解析每一个可视化节点并在所有地方添加EventHandler听起来很愚蠢......必须有一个更简单的方法。

有吗?

回答

1

这个问题中嵌入了一些需要解决的问题。

首先是RoutedEvent会向外传播并向上传播视觉树。因此,如果你已经嵌入控件中的控件像这样...

<Grid Name="MyGrid"> 
     <StackPanel> 
      <Button>Button 1</Button> 
      <Button>Button 2</Button> 
      <Button> 
       <TextBlock>Button 3</TextBlock> 
      </Button> 
     </StackPanel> 
    </Grid> 

...附加一个事件来处理MyGridKeyDown行为;将从其子女内接收任何KeyDownRoutedEvent

有一个警告,如果该事件被标记为由视觉树内的控件处理,这将是Button控件和MouseLeftButtonDown RoutedEvent的情况;那么你需要调整你的注册方式。这很简单,可以这样做;其中true表明即使另一个处理程序标记事件处理,也希望通知您。

public Window1() 
    { 
     InitializeComponent(); 

     MyGrid.AddHandler(UIElement.MouseLeftButtonDownEvent, new RoutedEventHandler(MouseLeftButtonDown), true); 
    } 

    private void MouseLeftButtonDown(object sender, RoutedEventArgs e) 
    { 
     Console.WriteLine("MouseLeftButtonDown Fired"); 
    } 

如果你用调试器来逐步通过你会看到的RoutedEvent的,当你点击文本按钮3源确实是TextBlock

这将解决您需要挂钩到不同的控件;因为您可以利用变化的RoutedEvents

焦点仍然必须存在于应用程序的某个地方,可以通过父控制轻松设置并调用Focus