10

我想创建一个以图像和文本块为内容的按钮。所以我开始寻找答案并找到了一个帖子(Reusable Custom Content for Buttons),它告诉我创建一个用户控件。

我这样做了,效果很好。我可以通过依赖属性设置图像源和文本。但是,我被卡住了,因为我的控件没有点击事件。

我做了更多的挖掘并得出结论,我可能需要一个从 Button 派生的 CustomControl。这个对吗?或者将点击事件连接到我的用户控件会更好吗?

这是我的用户控件:

<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" />
4

2 回答 2

32

最简单的选择是让您的 UserControl 公开一个单击事件,并通过您的 Button 的单击事件。

在 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);
    }
}

然后,您可以按原样保留“实现”代码。

于 2009-10-19T17:18:04.483 回答
3

答案实际上取决于您对控件的目标是什么。如果您可以操纵要绑定到的数据,则可以不创建用户或自定义控件而侥幸逃脱。如果您只想显示动态图像和文本,那么您可以创建一个包含两个属性的 ImageText 对象。然后,您可以将默认 Button 控件的 Content 属性绑定到此对象,并使用 DataTemplate 来定义内容的布局。

如果您无法控制要绑定的数据类型,或者如果您真的想创建一个控件,那么我建议您创建一个自定义控件。自定义控件允许您利用标准按钮的内置功能。通常,如果您想隐藏或封装控件中包含的可视控件的默认功能,您只需要创建一个用户控件。

祝你好运。

于 2009-10-19T17:03:17.513 回答