c# - 是否可以动态地将事件添加到 XAML 中的按钮?

标签 c# wpf xaml

我是 WPF/XAML 的新手,所以请耐心等待菜鸟问题。

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

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

我有 30 多个按钮,不想要 30 个不同的 Click="btnCustomers_click"+ 它们在 C# 代码中的各自函数。我想要的是说一个功能,它允许我单击任何按钮,然后根据选择的按钮打开一个新窗口。

下面的代码是我目前的设计,但是对于 30 多个按钮,它们将有很多功能并且会很困惑,因此我希望有一个功能可以根据单击哪个按钮来控制打开哪个窗口。

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

提前感谢您提供的任何建议!! :)

最佳答案

你可以为此使用样式:

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

如果您在没有x:Key 的资源中设置它,它将应用于所有按钮。


例如如果您有一个 Grid 并且您希望将某种样式应用于其中的所有 Button,您可以这样定义它:

<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

关于c# - 是否可以动态地将事件添加到 XAML 中的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726732/

相关文章:

c# - 使用 C# 使用加载数据本地 infile 时出错

c# - 检查字符串是否为空或C#中的所有空格

c# - WPF 保存网页浏览器 HTML

c# - 在“属性”窗口更改属性值后更新控件

xaml - 在 map 上显示图钉

c# - 在ListView的DataTemplate中设置Data Type时如何访问ListView Items?

c# - 正则表达式,用于匹配函数并捕获其参数

c# - 添加滑动手势以打开 SplitView Pane

c# - WPF窗口的黑色背景

c# - 如何在不创建 List<string> 的情况下将图像源绑定(bind)到路径列表?