我想创建一个按钮,其中包含图像和文本块作为内容。所以我去寻找答案,找到一个帖子( Reusable Custom Content for Buttons ),告诉我创建一个用户控件。
我这样做了,效果很好。我可以通过依赖属性设置图像源和文本。但是,我被卡住了,因为我的控件没有点击事件。
我做了一些挖掘并得出结论,我可能需要一个派生自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" />
答案 0 :(得分:26)
最简单的选择是让您的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);
}
}
然后您可以按原样保留“实施”代码。
答案 1 :(得分:3)
答案实际上取决于你的控制目标。如果您可以操纵绑定的数据,则可能无法创建用户或自定义控件。如果您只想显示动态图像和文本,则可以创建包含两个属性的ImageText对象。然后,您可以将默认Button控件的Content属性绑定到此对象,并使用DataTemplate定义内容的布局。
如果你无法控制你绑定的数据类型,或者如果你真的想要创建一个控件,那么我建议你创建一个自定义控件。自定义控件允许您使用标准按钮的内置功能。通常,如果要隐藏或封装控件中包含的可视控件的默认功能,则只需要创建用户控件。
祝你好运。