WPF事件和对象的引用,以及如何管理它们

时间:2009-04-06 13:45:27

标签: wpf events

我有一个小型WPF应用程序,它有一个Canvas和一个Grid。我在网格上放置了一些自定义用户控件。现在我想在它们上捕获一些鼠标事件。作为一个事件的结果,我想在画布上添加(或修改)某些东西。但是在用户控件中,您没有对底层画布的引用。第一个问题,是否有办法获得此引用,例如JavaScript中的getElementById(..)。

另外,我知道如果你想要一个干净的架构,你应该避免这样的引用。在这种情况下,最好是捕获特定用户控件上的事件,然后能够在另一个对象上调用某些东西。

2 个答案:

答案 0 :(得分:1)

您可以访问Canvas,Grid或UserControl中的任何其他元素。访问它们的最简单方法是确保每个人都有一个名字,这是通过使用x:Name属性完成的。

<Grid x:Name="myGrid">

然后在您的UserControl中,您可以使用myGrid访问它。要从UserControl外部访问网格,您需要在UserControl中创建一个允许您操作它的方法。

你可以在UserControl中使用this.FindName方法,该方法相当于javascript的getElementById,但是你不需要使用它,因为你可以直接用他们的名字访问对象。

答案 1 :(得分:1)

WPF有一个新的事件架构,可以帮助你在这里。所谓的“路由”事件可以从逻辑根容器,通过所有中间容器“隧道”到事件源元素,或者从源元素向上“冒泡”(即“隧道”和“冒泡”事件在相反的情况下传播方向)。

所有这一切都表明您通常可以通过在容器中注册事件处理程序来拦截来自子元素的事件。以下是拦截StackPanel中按钮的按钮点击事件的示例:

<StackPanel ButtonBase.Click="HandleButtonClick">
    <Button>Foo</Button>
    <Button>Bar</Button>
</StackPanel>

HandleButtonClick可能会像这样实现:

private void HandleButtonClick(object sender, RoutedEventArgs e)
{
    var button = e.OriginalSource as Button;
    if (button != null) MessageBox.Show(button.Content.ToString());
}

根据您使用的“自定义控件”类型,这可能无法实现。这是因为并非所有事件都是“路由”事件。 WPF控制事件通常是路由事件。