2009-04-15 34 views
24

Làm cách nào để thay đổi kiểu văn bản mặc định của một nút trong WPF?Nút WPF kiểu textwrap

Các giải pháp rõ ràng:

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

không hoạt động, vì Textwrapping không phải là một tài sản settable đây, rõ ràng.

Nếu tôi cố gắng:

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

tôi chỉ nhận được một câu trả lời vô giá trị từ trình biên dịch:

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

Loại bỏ các thẻ ControlTemplate giữ lỗi.

Nỗ lực sau mang lại một lỗi khác nhau:

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

tôi thấy rằng tôi có thể thiết lập các textwrapping cho từng nút riêng biệt, nhưng đó là khá ngu si. Làm thế nào tôi có thể làm điều đó như một phong cách? Từ ma thuật là gì?

Và để tham khảo trong tương lai, tôi có thể tìm danh sách các từ kỳ diệu này ở đâu, vì vậy tôi có thể tự làm điều này? Các mục MSDN là khá vô ích khi tôi cố gắng tìm hiểu về những thuộc tính có thể được thiết lập bởi setter.

Trả lời

24

phiên bản thứ hai của bạn nên làm việc, và làm cho tôi, với sự báo trước mà bạn cần phải thay đổi các văn bản TextBlock ràng buộc:

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

Chú giải này hoàn toàn thay thế các nút phong cách (tức là bạn sẽ cần phải tạo của bạn nút chrome riêng nếu bạn muốn).

Về câu hỏi thứ hai của bạn, tất cả các thuộc tính phụ thuộc có thể ghi có thể được đặt bằng Setter. Lý do bạn không thể đặt TextWrapping trên Nút thông qua một kiểu là Button không có thuộc tính phụ thuộc TextWrapping (hoặc thực sự là bất kỳ thuộc tính TextWrapping nào). Không có "từ ma thuật", chỉ là tên của các thuộc tính phụ thuộc.

+1

Không, đó là những lời kỳ diệu. Trong trường hợp này, các từ ma thuật là "TemplateBinding Content". Cảm ơn vì đã cho tôi biết. – mmr

36

Tôi đã giải quyết sự cố này bằng cách thêm TextBlock vào nút và sử dụng nút này để hiển thị văn bản nút thay vì thuộc tính Content của nút. Hãy chắc chắn đặt thuộc tính chiều cao của TextBlock thành Auto, sao cho nó tăng chiều cao để chứa số dòng văn bản khi nó kết thúc tốt đẹp.

+6

Điều này chắc chắn dễ dàng hơn/sạch hơn so với câu trả lời được chấp nhận, nhưng cách của anh ấy cũng hoạt động. –

+0

Xem các câu trả lời dưới đây để biết các ví dụ về mã cần thiết. –

32

Để mở rộng câu trả lời của Eric với một ví dụ: -

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

Dưới đây là một ví dụ về câu trả lời của Eric trong C# code-behind:

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>