在WPF按钮中可分离地对齐两段文本

时间:2011-08-09 19:56:44

标签: wpf xaml layout button controltemplate

我有一个相当简单的按钮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>
然而

: 一个。第二个文本块不显示。 湾我需要以不同于“内容”的方式指定第二个文本块的内容。

3 个答案:

答案 0 :(得分:2)

你可以将Button子类化为右对齐文本引入新的依赖项属性,但是你会遇到Content属性(你可以创建两个新属性并在{{} {虽然设置了{1}}。

要使布局正确,您应该使用Dockpaneldock左右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>

看起来像:

enter image description here

如果您希望第二个文本不同,则只需创建第二个属性。我将创建一个附加的依赖项属性,因此您仍然可以使用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);
  }
}