2009-04-15 16 views
24

Jak zmienić domyślny styl pakowania w przycisk w WPF?Przycisk tekstowego przycisku WPF

Oczywistym rozwiązaniem od:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="TextWrapping" Value="Wrap"></Setter> 
</Style> 

nie działa, ponieważ Textwrapping nie jest ustawiane nieruchomość tutaj, widocznie.

Gdy próbuję:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

ja po prostu bezwartościowe odpowiedź od kompilatora:

Error 5 After a 'SetterBaseCollection' is in use (sealed), it cannot be modified. 

Wyjmowanie tag ControlTemplate utrzymuje błąd.

Poniższa próba daje inny błąd:

<Setter Property="TextBlock"> 
     <TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/> 
    </Setter> 

Error 5 The type 'Setter' does not support direct content. 

widzę, że mogę ustawić textwrapping dla każdego przycisku z osobna, ale to dość asinine. Jak mogę to zrobić jako styl? Jakie są magiczne słowa?

I na przyszłość, gdzie mogę znaleźć listę tych magicznych słów, więc mogę to zrobić sam? Wpis MSDN jest całkiem bezużyteczny, gdy próbuję dowiedzieć się, które właściwości mogą być ustawione przez setter.

Odpowiedz

24

Twoja druga wersja powinna działać, a nie dla mnie, z zastrzeżeniem, że trzeba zmienić tekst TextBlock wiążące:

<!-- in Window.Resources --> 
<Style x:Key="fie" TargetType="Button"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <TextBlock Text="{TemplateBinding Content}" FontSize="20" TextWrapping="Wrap"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<!-- then --> 
<Button Style="{StaticResource fie}">verylongcaptiongoeshereandwraps/Button> 

Uwaga Ten całkowicie zastępuje przycisk styl (czyli trzeba będzie tworzyć swoje własny chromowany przycisk, jeśli chcesz).

Odnośnie drugiego pytania, wszystkie właściwości zależności zapisu można ustawić za pomocą Settera. Powodem, dla którego nie można ustawić opcji TextWrapping na przycisku za pomocą stylu, jest to, że Button nie ma właściwości zależnej TextWrapping (ani żadnej właściwości TextWrapping). Nie ma "magicznych słów", tylko nazwy właściwości zależności.

+1

Nie istnieją magiczne słowa. W tym przypadku magiczne słowa to "Treść TemplateBinding". Dzięki, że dałeś mi znać. – mmr

36

Rozwiązałem ten problem, dodając do przycisku przycisk TextBlock i używając go, aby wyświetlić tekst przycisku zamiast właściwości przycisku Content przycisku. Pamiętaj, aby ustawić wartość wysokości TextBlock na Auto, tak aby rosła na wysokości, aby pomieścić liczbę wierszy tekstu podczas zawijania.

+6

Jest to zdecydowanie łatwiejsze/czystsze niż przyjęta odpowiedź, ale jego sposób też działa. –

+0

Zobacz poniżej odpowiedzi na przykłady potrzebnego kodu. –

32

Aby rozwinąć odpowiedź Erica na przykładzie: -

<Button Name="btnName" Width="50" Height="40"> 
    <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/> 
</Button> 
4

Oto przykład odpowiedzi Erica w C# kodu za:

var MyButton = new Button(); 

MyButton.Content = new TextBlock() { 
    FontSize  = 25, 
    Text   = "Hello world, I'm a pretty long button!", 
    TextAlignment = TextAlignment.Center, 
    TextWrapping = TextWrapping.Wrap 
}; 
3
<Style TargetType="Button"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Powiązane problemy