我有一个相当简单的按钮ControlTemplate来设置按钮的样式。 我被要求将按钮文本的一部分与按钮右侧对齐。因此,某些文本将左对齐,有些右对齐。 可以理解指向这种方法的指针。 这就是我到目前为止所做的:
<ControlTemplate x:Key="ListItemNameTemplate" TargetType="Button">
<Grid Height="40">
<Border Width="200"
x:Name="BgEnabled"
HorizontalAlignment="Center"
Margin="1,1,1,1"
Background="YellowGreen">
<StackPanel Orientation="Vertical">
<TextBlock Width="150"
x:Name="textBlock"
Text="{TemplateBinding Content}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Foreground="White"
FontSize="24"
FontWeight="Bold"/>
<TextBlock Width="50"
x:Name="textBlock1"
Text="{TemplateBinding Content}"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Foreground="White"
FontSize="24"
FontWeight="Bold"/>
</StackPanel>
</Border>
</Grid>
</ControlTemplate>
然而: 一个。第二个文本块不显示。 湾我需要以不同于“内容”的方式指定第二个文本块的内容。
答案 0 :(得分:2)
你可以将Button
子类化为右对齐文本引入新的依赖项属性,但是你会遇到Content
属性(你可以创建两个新属性并在{{} {虽然设置了{1}}。
要使布局正确,您应该使用Dockpanel
(dock左右LastChildFill
设置为Content
)或Grid
(带三列,中间休息,左侧和右侧是自动调整大小。
答案 1 :(得分:1)
像这样:
<Window.Resources>
<ControlTemplate TargetType="{x:Type Button}"
x:Key="MyButtonTemplate">
<Border>
<DockPanel LastChildFill="True">
<TextBlock Text="{TemplateBinding Content}"
DockPanel.Dock="Top"/>
<TextBlock Text="{TemplateBinding Content}"
TextAlignment="Right" />
</DockPanel>
</Border>
</ControlTemplate>
</Window.Resources>
<Button Template="{StaticResource MyButtonTemplate}">
Hello World
</Button>
看起来像:
如果您希望第二个文本不同,则只需创建第二个属性。我将创建一个附加的依赖项属性,因此您仍然可以使用TextBox而不必将其子类化并搞砸项目中的所有UI元素。使用片段“propa”开始使用Visual Studio。这很简单。见这里:http://msdn.microsoft.com/en-us/library/ms749011.aspx
像这样:
public class MyButtonThing
{
public static string GetText2(DependencyObject obj)
{
return (string)obj.GetValue(Text2Property);
}
public static void SetText2(DependencyObject obj, string value)
{
obj.SetValue(Text2Property, value);
}
public static readonly DependencyProperty Text2Property =
DependencyProperty.RegisterAttached("Text2",
typeof(string), typeof(System.Windows.Controls.Button));
}
而且:
<Window.Resources>
<ControlTemplate TargetType="{x:Type Button}"
x:Key="MyButtonTemplate">
<Border>
<DockPanel LastChildFill="True">
<TextBlock Text="{TemplateBinding Content}"
DockPanel.Dock="Top"/>
<TextBlock TextAlignment="Right" Text="{Binding
RelativeSource={RelativeSource AncestorType=Button},
Path=(local:MyButtonThing.Text2)} " />
</DockPanel>
</Border>
</ControlTemplate>
</Window.Resources>
<Button Template="{StaticResource MyButtonTemplate}"
local:MyButtonThing.Text2="Where's Waldo">
Hello World
</Button>
答案 2 :(得分:1)
附属物业路线当然是解决这个问题的方法。我和这个例子的新主题对我不起作用。控件模板无法识别新属性。 有效的更改是修改附加属性定义方式的方法。
感谢这篇文章的指针: http://www.deepcode.co.uk/2008/08/exposing-new-properties-for-control_15.html
public class MyButtonThing : DependencyObject
{
public static readonly DependencyProperty SubTextProperty =
DependencyProperty.RegisterAttached("SubText",
typeof(String), typeof(MyButtonThing),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsMeasure |
FrameworkPropertyMetadataOptions.AffectsArrange));
public static void SetSubText(UIElement element, object o)
{
element.SetValue(SubTextProperty, o);
}
public static string GetSubText(UIElement element)
{
return (string)element.GetValue(SubTextProperty);
}
}