Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有人能在WPF中提出任何RoutedEvent吗?_C#_.net_Wpf_Routed Events - Fatal编程技术网

C# 有人能在WPF中提出任何RoutedEvent吗?

C# 有人能在WPF中提出任何RoutedEvent吗?,c#,.net,wpf,routed-events,C#,.net,Wpf,Routed Events,在C#中,事件总是受到很好的保护:只有事件的所有者才能触发它们。然而,这在WPF中似乎是完全不同的——任何人都可以在任何时间抛出任何事件。为了测试这一点,我在底部编写了代码 当我使用RaiseEvent来提升按钮。单击时,上面的事件捕捉到了它。这是WPF活动的计划行为吗?就让任何人随意举办任何活动?另外,如果是这样,那么在注册事件时OwnerType的含义是什么?我认为这是一种保护,但如果是的话,这是一种糟糕的保护,因为任何人都可以访问公共事件并使用AddOwner函数添加更多的所有者 谢谢 X

在C#中,事件总是受到很好的保护:只有事件的所有者才能触发它们。然而,这在WPF中似乎是完全不同的——任何人都可以在任何时间抛出任何事件。为了测试这一点,我在底部编写了代码

当我使用RaiseEvent来提升按钮。单击时,上面的事件捕捉到了它。这是WPF活动的计划行为吗?就让任何人随意举办任何活动?另外,如果是这样,那么在注册事件时OwnerType的含义是什么?我认为这是一种保护,但如果是的话,这是一种糟糕的保护,因为任何人都可以访问公共事件并使用AddOwner函数添加更多的所有者

谢谢

XAML

<StackPanel Button.Click="ButtonBase_OnClick">
    <Button Name="RealButton">Real button</Button>
    <WpfWindow:VitalyControl MouseDown="UIElement_OnMouseDown">
      I am almost a button
    </WpfWindow:VitalyControl>
</StackPanel>
和处理程序:

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Button was pressed");
    }

这是出于设计,实际上也是RoutedEvents的原因之一。它们被称为路由事件,因为它们是跨元素树路由的。您正在经历的行为称为上的“单一处理程序连接点”。您指定StackPanel应侦听所有按钮。单击事件

在自定义控件中,引发按钮单击事件。这会“冒泡”到stackpanel,stackpanel会处理它

更新:

要使此路由正常工作,我假设每个ui元素都需要能够引发任何路由事件。路由事件仅由UI元素使用,是WinForms实现复杂性的答案。它们不能替代CLR事件。
所有者类型在内部使用。

所有者类型更多地用于Blend和VS等设计工具,也用于调试。如果您有RoutedEvent对象的实例,您希望能够知道它是哪个路由事件,包括知道路由事件属于哪种类型。@Joe White:这样任何人都可以在WPF中抛出任何事件?为什么C语言会有如此大的飞跃?在C语言中,没有人(甚至派生类)可以触发其他人的事件,无论是在WPF中,每个人都可以。我以前没有想过,但显然是这样。WPF中的很多东西都是由于反馈和人们在WinForms中遇到的问题造成的,所以我认为他们是故意做这个更改的。@Steven Jeuris的回答指出,很难让他们像过去一样成为超级私人,因为他们可以通过不相关的课程。嗨,Steven,我理解这种冒泡。我对控件的能力更为困惑,因为它与按钮完全没有联系,无法引发点击事件。我认为只有事件的所有者才能这样做。我猜这是因为UIElement要能够将接收到的事件路由到元素树上,它可能需要能够引发任何可能的路由事件。为了解释这些事件,它们需要公开。也许可以更好地封装它,但我不认为这有什么大的好处。路由事件仅由UI元素使用。路由事件不能替代CLR事件。它们只是简化了UI的事件。总结一下:)-任何对象都可以引发任何事件,任何对象都可以捕获任何事件。所有者类型不是为了保护事件的封装而设计的,它的目的完全不同。
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Button was pressed");
    }