如何从Button派生的CustomControl中获取“默认按钮外观”?

时间:2013-03-14 15:24:43

标签: c# wpf button custom-controls

this Stackoverflow question

的帮助下,尝试为按钮编写自己的自定义控件

但除了图像和文字之外,Button控件为空

如果没有指定其他内容,是否有可能使用默认行为?

我不想重写一个完整的按钮,如果已经存在几乎适合的话。只是想添加一个ImageSource和一个文本以及一些而不是全部的样式。

这是我所得到的,也许我只是犯了一些错误。

班级定义:

public class MyImageButton : Button
{
    static MyImageButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyImageButton), new FrameworkPropertyMetadata(typeof(MyImageButton)));
    }

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

    public static readonly DependencyProperty ImageSourceProperty =
        DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(MyImageButton), new UIPropertyMetadata(null));

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(MyImageButton), new UIPropertyMetadata(null));
}

来自generic.xaml

<Style TargetType="{x:Type local:MyImageButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyImageButton}">
                <StackPanel Height="Auto" Orientation="Horizontal">
                    <Image Source="{TemplateBinding ImageSource}" Width="24" Height="24" Stretch="Fill" />
                    <TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Left" Foreground="Black" FontWeight="Bold"  Margin="5,0,0,0" VerticalAlignment="Center" FontSize="12" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

最后在mainwindow中使用xaml

<ctrl:MyImageButton ImageSource="SomeImage.png" Text="BlaBlubb" Height="100" Width="120" Click="CheckClick" />

1 个答案:

答案 0 :(得分:2)

But the Button control is empty besides the image and the text.

这就是你在这里实现的:

<StackPanel Height="Auto" Orientation="Horizontal">
    <Image Source="{TemplateBinding ImageSource}" Width="24" Height="24" Stretch="Fill"/>
    <TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Left" Foreground="Black" FontWeight="Bold"  Margin="5,0,0,0" VerticalAlignment="Center" FontSize="12" />
</StackPanel>

默认行为是什么意思?

一个简单的选择就是:

<Style TargetType="{x:Type local:MyImageButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyImageButton}">
                <Button>
                    <StackPanel Height="Auto" Orientation="Horizontal">
                        <Image Source="{TemplateBinding ImageSource}" Width="24" Height="24" Stretch="Fill"/>
                        <TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Left" Foreground="Black" FontWeight="Bold"  Margin="5,0,0,0" VerticalAlignment="Center" FontSize="12" />
                    </StackPanel>
                </Button>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

第二种选择,在您的情况下可能最好:

从按钮派生UserControl,大概如下:

<Button x:class="..."
        x:Name="root">
    <StackPanel Height="Auto" Orientation="Horizontal">
        <Image Source="{Binding Image, ElementName=root}" Width="24" Height="24" Stretch="Fill"/>
        <TextBlock Text="{Binding Text, ElementName=root}" HorizontalAlignment="Left" Foreground="Black" FontWeight="Bold"  Margin="5,0,0,0" VerticalAlignment="Center" FontSize="12" />
    </StackPanel>
</Button>

并在UserControl的代码隐藏中定义依赖项属性。

根据经验:当您的目标是以可重用的方式安排(其他)控件时,请使用UserControl。