实现我的控件的最佳方式是什么

What is the best way to implement my control

我需要像这样的许多不同的按钮:

<Button Style="{StaticResource DetailSectionButton}" Click="Button_Click_5">
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="Auto"/>
         <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>

      <Image Grid.Column="0" Stretch="None" 
                             Margin="0 0 10 0"
                             Source="../Assets/icons/info.png" />
      <TextBlock Text="info" Grid.Column="1"
                                   Margin="0 10 0 0" />
   </Grid>
</Button>

每个按钮都有自己的 Image.SourceTextBlock.Text 和 Button.Click 事件处理程序。

如果我想使用这个按钮是这样的,那么这个按钮的实现方式是什么:

 <MyButton ImageSource="../Assets/icons/info.png" Text="info" Click="Button_Click_5" />

我需要创建 UserControl 还是使用一些模板或附件就足够了属性?

创建一个新的用户控件,它有xaml和代码隐藏。 现在将 xaml usercontrol 更改为 Button,并在后面的代码中将继承的 clase 从 usercontrol 更改为 Button。

现在添加按钮的内容

然后使用设置控件值的事件添加依赖属性

我看到至少有两种方法可以做到这一点。

首先是从 Button 继承,使用您的 ImageSource 依赖项扩展它 属性 并在 DataTemplate 中绑定到它。

另一种方法是创建附加的 ImageSource 属性,并在 DataTemplate 中绑定到它,如下所示:

public class Config
{
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.RegisterAttached(
        "ImageSource", typeof (ImageSource), typeof (Config), new PropertyMetadata(default(ImageSource)));

    public static void SetImageSource(DependencyObject element, ImageSource value)
    {
        element.SetValue(ImageSourceProperty, value);
    }

    public static ImageSource GetImageSource(DependencyObject element)
    {
        return (ImageSource) element.GetValue(ImageSourceProperty);
    }
}

这是数据模板和按钮:

<DataTemplate x:Key="ButtonTemplate">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Image Grid.Column="0"
               Source="{Binding Path=(s:Config.ImageSource),
                                RelativeSource={RelativeSource AncestorType=Button}}"
               Stretch="None" />
        <TextBlock Grid.Column="1"
                   Margin="0 10 0 0"
                   Text="{Binding}" />
    </Grid>
</DataTemplate>

<Button Click="Button_Click_5" 
        Content="Info"
        ContentTemplate="{StaticResource ButtonTemplate}"
        s:Config.ImageSource="media_stop_red.png" />

希望对您有所帮助。

编辑

只需扩展具有 ImageSource 依赖项的按钮控件 属性 并为其创建默认样式,如下所示:

public class MyButton : Button
{
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register(
        "ImageSource", typeof (ImageSource), typeof (MyButton), new PropertyMetadata(default(ImageSource)));

    public ImageSource ImageSource
    {
        get { return (ImageSource) GetValue(ImageSourceProperty); }
        set { SetValue(ImageSourceProperty, value); }
    }

    public MyButton()
    {
        DefaultStyleKey = typeof (MyButton);
    }
}

样式和按钮本身:

    <Style TargetType="s:MyButton">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="s:MyButton">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0"
                               Source="{TemplateBinding ImageSource}"
                               Stretch="None" />
                        <TextBlock Grid.Column="1"
                                   Margin="0 10 0 0"
                                   Text="{Binding}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <s:MyButton Content="Info" ImageSource="..\media_stop_red.png" />