繁体   English   中英

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

[英]WPF Events and references to objects, and how to manage them

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

我也知道,如果您想要干净的体系结构,则应避免使用此类引用。 在这种情况下,最好的做法是在特定的用户控件上捕获事件,然后能够在另一个对象上调用某些东西。

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

<Grid x:Name="myGrid">

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

您可以在UserControl中使用this.FindName方法,该方法与javascript的getElementById等效,但是您无需使用它,因为您可以直接使用对象的名称访问对象。

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控制事件通常是路由事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM