是否可以在XAML中向按钮动态添加事件?

时间:2011-04-20 07:11:12

标签: c# wpf xaml

我是WPF / XAML的新手,所以请忍受noob问题。

我设计了一个控制面板,最终将作为我网站的后端,并且刚刚使用TabControl元素完成了选项卡中所有按钮的布局。 (这是使用Visual Studio“窗口”表单设计的。

我的问题是,是否可以在xaml.cs文件中创建一个函数来动态处理我所有按钮元素的特定事件?例如......

我有30多个按钮,不想在c#代码中使用30个不同的Click =“btnCustomers_click”+各自的功能。我想要的是说一个功能,允许我点击任何按钮,然后根据选择的按钮打开一个新窗口。

以下代码是我目前的设计,但对于30多个按钮,它们将有很多功能,而且会很混乱,因此我希望有一个功能控制哪个窗口打开,具体取决于点击的按钮。

        private void btnMerchants_click(object sender, RoutedEventArgs e)
    {
        var newWindow = new frmMerchants();
        newWindow.Show();
    }

提前感谢任何建议!! :)

3 个答案:

答案 0 :(得分:5)

你可以使用一种风格:

<Style TargetType="{x:Type Button}">
    <EventSetter Event="Click" Handler="btnMerchants_click"/>
</Style>

如果你在没有x:Key的地方的资源中进行设置,它将适用于所有按钮。


e.g。如果您有一个网格,并且您希望某个样式应用于其中的所有按钮,您可以这样定义:

<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type Button}">
            <EventSetter Event="Click" Handler="Button_Click"/>
        </Style>
    </Grid.Resources>
    <Grid.Children>
        <!-- Buttons and stuff -->
    </Grid.Children>
</Grid>

如果您只想将其应用于某些按钮,请设置x:Key并引用样式:

<Grid>
    <Grid.Resources>
        <Style x:Key="AttachClickHandlerStyle" TargetType="{x:Type Button}">
            <EventSetter Event="Click" Handler="Button_Click"/>
        </Style>
    </Grid.Resources>
    <Grid.Children>
        <Button Content="Click me!" Style="{StaticResource AttachClickHandlerStyle}"/>
        <Button Content="Click me, too!" Style="{StaticResource AttachClickHandlerStyle}"/>
        <Button Content="Something different." Click="SomeOtherButton_Click"/>
    </Grid.Children>
</Grid>

通常,您应该将多次出现的属性重构为样式以防止重复代码。

此外,由于您是初学者,因此可能会对以下文章感兴趣:

Styling and Templating
Resources Overview

答案 1 :(得分:3)

您可以在父容器上使用路由事件 例如:

<Grid Button.Click="GeneralHandler">
 <!-- Some stuff -->
</Grid>

在背后的代码中:

public void GeneralHandler(object sender, RoutedEventArgs e)
{
 Button b = e.OriginalSource as Button;
 //<-- Do something
}

您可以详细了解on MSDN

答案 2 :(得分:1)

只需为所有按钮分配完全相同的Click =“btnCustomers_click”处理程序(带有常规函数名称)。然后在该函数中根据发件人的名称打开正确的窗口。