但除了图像和文字之外,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" />
答案 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。