为包含按钮的WPF用户控件创建自定义单击事件处理程序?

时间:2009-05-20 15:31:32

标签: wpf user-controls click event-handling

您是否在使用嵌套按钮控件为自定义WPF用户控件分配单击事件处理程序时遇到问题?我做。

当您将这样的用户控件放在主窗口中时,假设Main.xaml,MouseLeftButtonDown不起作用,但PreviewMouseLeftButtonDown就像魅力一样。

但是想象一下你自己告诉团队中的每个开发人员在使用你的用户控件时都要使用这个事件...你库中的一些用户控件有MouseLeftButtonDown,有些则是PreviewMouseLeftButtonDown ....这是一团糟你不同意吗?

所以我有一个解决方案,但我希望有人看看是否有一些优雅的方法来创建名为“Click”的自定义事件处理程序。

在我的名为CustomButton.xaml.cs的usercontrol中,我到目前为止:

public partial class CustomButton: UserControl
{

    public CustomButton()
        : base()
    {
        this.InitializeComponent();

    }

    public delegate void ClickHandler(object sender, EventArgs e);
    public event EventHandler Click;

    public void Button_Click(object sender, RoutedEventArgs e) {//execute daddy's button click
            (((sender as Button).Parent as Grid).Parent as CustomButton).Click(sender, e);

            e.Handled = false;

    }

在我的CustomButton.xaml

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="YourCompany.UI.Controls.CustomButton" d:DesignHeight="72.5" d:DesignWidth="200">
<UserControl.Resources>
blablabla
</UserControl.Resources>

<Grid x:Name="LayoutRoot">
    <Button Style="{DynamicResource CustomButton}" 
            Width="{Binding ElementName=CustomButton, Path=ActualWidth}" 
            Cursor="Hand" Foreground="#ffffff" FontSize="28" Margin="8,8,0,12" 
            HorizontalAlignment="Left" 
            Content="Custom Button" Click="Button_Click" />


</Grid>

现在在我的Main.xaml中,调用者,我有:

<Window x:Class="YourCompany.MyProject.Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyProject!" Height="600" Width="800" 
MinWidth="800" MinHeight="600" WindowState="Maximized" WindowStartupLocation="CenterScreen"
xmlns:bigbola="clr-namespace:YourCompany.UI.Controls;assembly=YourCompany.UI.Controls">

<mycontrols:CustomButton Name="test" MyImage=".\Images\btnOptions.png" Cursor="Hand" 
            Texto="See options" Click="test_Click"
            Margin="168.367,176.702,253.609,0" ToolTip="See all options" Height="76.682" 
            VerticalAlignment="Top"></mycontrols:CustomButton>

说明:

在usercontrol中,当您单击嵌套按钮时,它会执行其父自定义“Click”处理程序。

有没有一种优雅的方法来达到同样的效果?

3 个答案:

答案 0 :(得分:2)

关闭mdm20所说的内容...当你可以更轻松地创建一个CustomControl(一个扩展现有控件功能的控件,例如1)时,为什么要创建一个UserControl(一组控件分组为1)?作为按钮)?假设Button是您在CustomButton中唯一需要的控件,我强烈建议您使用CustomControl(UserControl)。

UserControl与CustomControl的示例here

希望这有帮助!

答案 1 :(得分:1)

如果您实施按钮,为什么不从按钮派生?

要回答你的问题,你只需要这个。

if (Click != null) Click(this, EventArgs.Empty);

答案 2 :(得分:0)

不能这一行:

(((sender as Button).Parent as Grid).Parent as CustomButton).Click(sender, e);

替换为

this.Click(sender, e);

除此之外,答案取决于您想要的确切行为。如果你想点击你的用户控件的事件只在你单击内部按钮时触发,那么我认为你正在以正确的方式处理它。另一方面,如果您希望在用户控件的边界内单击任何位置时触发click事件,那么您可能是最好的样式或继承标准按钮控件。请记住,在WPF中,按钮的内容可以是任何其他元素,包括另一个按钮。