0

我有一个应用程序,其中在 TabControl 中有一个自定义 UserControl。每隔一段时间,整个应用程序都需要刷新它的数据。为了处理它,我在代码隐藏中执行以下操作。

    public void OnDataReloaded(object a)
    {
        WindowManager.GraphControl = new GraphControl();
        GraphTab.Content = WindowManager.GraphControl;
        graphloaded = true;
    }

GraphTab 是我的 TabControl 中的 TabItem 的一个实例。WindowManager 是一个静态类,它处理对当前活动用户控件的引用。在我的 UserControl 上,我添加了一个事件处理程序: KeyDown="MyGraphControl_KeyDown_1" 作为 UserControl 的属性。

在我执行上面的代码后,一切都按预期工作。我的 TabControl 加载新的 UserControl,但是不再捕获 keydown 事件。知道为什么会这样吗?

谢谢!

4

3 回答 3

0

在 OnDataReloaded 方法中订阅 KeyDown 事件。您在那里创建控件的新实例,而 XAML 中的 KeyDown 仅适用于创建的第一个实例。

于 2012-10-18T07:20:24.130 回答
0

在没有看到更多代码的情况下,很难给出任何明确的答案,但一种可能性是您的旧按键处理程序仍在执行。根据该处理程序的作用,它可能会阻止 WPF 将进一步的按键事件发送到其他代码。

如果您在替换旧用户控件时没有取消分配旧用户控件上的事件处理程序,它将继续执行。

当然,这都是纯粹的猜测,可能完全是另外一回事!

于 2012-10-18T07:20:33.253 回答
0

我不是 100% 肯定,但我最好的猜测是,因为它是 GraphControl 的新实例 - 事件将被销毁或仍与内存中控件的旧实例相关联。

在给它一个新实例之前,请确保您取消订阅事件并尝试将事件处理程序重新指向您的方法。

希望有帮助!

圣。

于 2012-10-18T07:20:38.753 回答