WPF MouseWheel和KeyDown没有输入焦点没有被调用?

时间:2011-03-16 14:55:36

标签: wpf focus keydown mousewheel

我有一个自定义类(ItemsContainer),其中包含几个按钮&用户控件。

我正在使用鼠标和放大器实现导航系统。输入,并且用户可以使用右键单击来“平移”...但除非用户单击交互式按钮(按钮等),否则不会调用我的'mousewheel'和'keydown'方法。

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

有吗?

1 个答案:

答案 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