如何将事件从用户控件冒泡到包含在其中的窗口?

时间:2014-05-09 14:36:22

标签: c# wpf xaml routed-events

我有一个用户控件,其中包含我在窗口中显示的搜索栏和搜索按钮。在按钮上单击我希望事件冒泡到窗口,我可以在后面的窗口代码中执行操作。我不想把按钮点击代码放在后面的用户控制代码中。我该怎么做?

Window的xaml如下所示:

<dx:DXWindow
x:Class="Client.Support.AskAQuestionDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:libRes="clr-namespace:Shared.Lib.Resources;assembly=Shared.Lib"
xmlns:support="clr-namespace:Client.Support"
xmlns:gui="clr-namespace:Client.GUI;assembly=Client.GUI"
Title="{x:Static libRes:Strings.AskAQuestion}" Loaded="DXWindow_Loaded" 
Height="150" Width="700">

<Grid>
    <Viewbox>
        <support:ZenForumSearchBar VerticalAlignment="Center" HorizontalAlignment="Center"/>
    </Viewbox>
</Grid>
</dx:DXWindow>

在UserControl背后的代码中,我有Click事件的代码

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        RaiseEvent(e);
    }

在包含用户控件的窗口中,我尝试使用处理程序来处理这样的事件

    private void ButtonHandler(object sender, RoutedEventArgs e)
    {
        FrameworkElement fe = e.Source as FrameworkElement;
        switch (fe.Name)
        {
            case "_knowledgeBaseSearchButton":
                break;
        }
        e.Handled = true;
    }

我认为我做的一切都完全错了。如何让UserControl中发生的事件冒泡到实例化的窗口?

1 个答案:

答案 0 :(得分:2)

Button.Click已经冒泡,因此您Button_Click中不需要UserControl。您需要做的就是在WindowGridViewBox

附加处理程序
<Grid Button.Click="ButtonHandler">

并在处理程序中检查e.OriginalSource而不是e.Source

var fe = e.OriginalSource as FrameworkElement;

它应该有效