如何为自定义用户控件按钮连接点击事件?我应该使用CustomControl吗?

10

我想创建一个内容为图片和文本块的按钮。于是我搜寻了一篇文章(按钮可重用自定义内容),得知可以通过创建一个用户控件来实现。

我按照方法创建了这个用户控件,它能够很好地工作。我可以通过依赖属性设置图片来源和文本。但是,我卡在了无法为我的控件添加点击事件上。

我进行了更多的调查,得出结论可能需要从Button派生一个CustomControl。这样做正确吗?还是将点击事件与我的UserControl连接起来会更好呢?

这是我的UserControl:

<UserControl x:Class="Client.Usercontrols.MyButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" MinHeight="30" MinWidth="40"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <Button Width="Auto" HorizontalAlignment="Center">
        <Border CornerRadius="5" BorderThickness="1" BorderBrush="Transparent" >
            <Grid>
                <Image Name="tehImage" Source="{Binding ImageSource}" />
                <TextBlock Name="tehText" Text="{Binding Text}"
                           Style="{DynamicResource ButtonText}" />
            </Grid>
        </Border>
    </Button>
</UserControl>

实现

<my:MyButton ImageSource="../Images/MainSyncButton.png" ImageWidth="141" Text="Synchronise" Click="btnSynchronise_Click" />
2个回答

33

最简单的方法是让您的 UserControl 公开一个 click 事件,并传递您的 Button 的 click 事件。

在 MyButton 的 XAML 中:

<Button Width="Auto" HorizontalAlignment="Center" Click="onButtonClick">
在 MyButton 的代码中:
public event RoutedEventHandler Click;

void onButtonClick(object sender, RoutedEventArgs e)
{
    if (this.Click != null)
    {
        this.Click(this, e);
    }
}

您可以保留您的“实现”代码不变。


3
答案实际上取决于您对控件的目标是什么。如果您可以操纵绑定到的数据,则可能无需创建用户或自定义控件。如果您只想显示动态图像和文本,则可以创建一个ImageText对象,其中包含两个属性。然后,您可以将默认Button控件的Content属性绑定到此对象,并使用DataTemplate定义内容的布局。
如果您无法控制要绑定到的数据类型,或者如果您真的想创建一个控件,则建议创建自定义控件。自定义控件允许您利用标准按钮的内置功能。通常,只有在您想要隐藏或封装控件中包含的可视控件的默认功能时,才需要创建用户控件。
祝好运。

还有一个不错的建议,但是这次我打算坚持使用UserControl来熟悉它。不过还是谢谢你帮我解答了一些问题。 - 4imble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接