我有一个自定义类(ItemsContainer),其中包含几个按钮&用户控件。
我正在使用鼠标和放大器实现导航系统。输入,并且用户可以使用右键单击来“平移”...但除非用户单击交互式按钮(按钮等),否则不会调用我的'mousewheel'和'keydown'方法。
到目前为止我发现的最好的文章说我需要在每一个控制中“勾住”自己!解析每个可视节点并在任何地方添加EventHandler听起来很愚蠢......必须有一种更简单的方法。
有吗?
答案 0 :(得分:1)
此问题中嵌入了一些需要解决的问题。
首先,RoutedEvent
将向外传播视觉树。因此,如果您在控件中嵌入了控件,例如......
<Grid Name="MyGrid">
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>
<TextBlock>Button 3</TextBlock>
</Button>
</StackPanel>
</Grid>
...附加事件以处理KeyDown
上的MyGrid
行为;将从其子女中收到任何KeyDown
RoutedEvent
。
有一点需要注意,如果事件由可视树中的控件标记处理,那么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");
}
如果您使用调试器,当您单击文本按钮3 时,您将看到RoutedEvent的来源确实是TextBlock
。
这将解决您需要加入不同的控件;因为你可以利用变化的RoutedEvents
。
然而,焦点仍然必须存在于应用程序的某个地方;可以通过父控件轻松设置并调用Focus
。