2011-08-09 82 views
1

我有一個合理簡單的按鈕ControlTemplate來設置按鈕的樣式。 我被要求將該按鈕的一部分文本對齊按鈕的右側。因此有些文字會左對齊,右對齊。 指向這種方法的指針將不勝感激。 這是我到目前爲止有:在WPF按鈕中將兩段文本可分離地對齊

<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> 

但是: 一個。第二個文本塊不顯示。 b。我需要爲「內容」指定第二個文本塊的內容。

回答

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); 
    } 
} 
2

你也可以繼承Button推出針對右對齊文本的新依賴屬性,你將與Content財產被卡住,但(你可以創建兩個新的屬性,如果Content設置雖然拋出一個異常)。

要獲得您應使用Dockpaneldock左右,LastChildFill設置爲false)佈局權或Grid(有三列,中間需要休息,左&右側是自動調整大小)。

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> 
+0

我糾正該錯誤,由於@ H-B;乾杯。 –

+0

我正在使用此示例來解決此問題。還沒有爲我工作,但目前我沒有給予我全面的關注。只是想感謝你的回覆。 – Jemmitch

+0

不知道我在這裏錯過了什麼,但這個例子不適合我。我已經在一個新的解決方案中嘗試了上面的代碼。執行時出現以下異常:在「System.Windows.Baml2006.TypeConverterMarkupExtension」上提供值引發異常。內部異常是{「屬性路徑無效。'MyButtonThing'沒有名爲'Text2'的公共屬性。」} – Jemmitch