2011-08-09 5 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. 두 번째 텍스트 블록의 내용을 "내용"과 다르게 지정해야합니다. (두 개의 새 속성을 만들고 Content는하지만 설정되어있는 경우 예외를 던질 수있다)하지만

답변

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 속성 붙어있을 것입니다.

(오른쪽 자동 크기입니다 &를 떠나, 세 개의 열, 중간 소요 나머지) 당신이 ( falsedock 왼쪽과 오른쪽, LastChildFill 세트)를 Dockpanel를 사용해야하거나 레이아웃 권리 또는 Grid를 얻으려면. 이처럼

1

:

enter image description here

당신이 그럼 그냥 두 번째 속성을 만들 다른 두 번째 텍스트를 원하는 경우 :

<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 요소를 망칠 수 있습니다. Visual Studio에서 시작하려면 스 니펫 "propa"를 사용하십시오. 그것은 간단합니다. 여기를 참조하십시오 : 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

관련 문제