2012-02-17 32 views
7

Trong ứng dụng của tôi, tôi có một mạng lưới các nút hình vuông. Nội dung văn bản cho mỗi nút được đặt ở thời gian chạy. Trong hầu hết các trường hợp, văn bản chỉ dài một ký tự, nhưng đôi khi dài hơn. Tôi cần phải làm cho toàn bộ văn bản luôn hiển thị, tức là kéo dài văn bản (thay đổi kích thước phông chữ) để vừa với đường viền của nút. Tôi phải làm nó như thế nào?Làm cách nào để kéo giãn văn bản trong một nút hình vuông?

Tôi đã cố gắng sử dụng Hộp xem nhưng không hiệu quả.

Một phiên bản đơn giản của XAML của tôi:

<Viewbox Stretch="Uniform"> 
    <Button Content="Text" 
      Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
</Viewbox> 

Bất kỳ ý tưởng về làm thế nào tôi có thể đạt được những gì tôi cần (ví dụ: hình vuông nút + văn bản luôn phù hợp)?

+2

Bất kỳ lý do a [UniformGrid] (http://www.wpftutorials.com/2011/03/wpf-uniformgrid .html) sẽ không hoạt động? Phông chữ của bạn sẽ không thay đổi động, bạn sẽ cần phải tăng điều đó bằng cách liên kết thuộc tính thích hợp với một cái gì đó mà bạn điều chỉnh. –

+0

Tôi đã sử dụng UniformGrid để giữ các nút, nhưng điều đó chỉ khiến chúng trở thành _same size_, chứ không phải _square_. – agnes

Trả lời

6

đề nghị ban đầu của bạn là gần đúng, hãy thử này:

<Button> 
     <Viewbox Stretch="Fill"> 
      <TextBlock Text="Test"/> 
     </Viewbox> 
    </Button> 

Và để áp dụng điều này để nhiều nút:

<Style x:Key="StretchedButtonContent" TargetType="{x:Type Button}"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <Viewbox Stretch="Fill"> 
         <ContentPresenter Content="{TemplateBinding Content}"/> 
        </Viewbox> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Button Style="{StaticResource StretchedButtonContent}" Content="Test" /> 

Suy nghĩ đầu tiên của tôi là sử dụng một RenderTransform và phần mềm convert. Điều này sẽ cho kết quả tương tự nhưng là phức tạp hơn:

<Converters:ScaleConverter x:Key="ScaleConverter" /> 

    <Button> 
     <TextBlock Text="Test" RenderTransformOrigin="0.5,0.5"> 
      <TextBlock.RenderTransform> 
       <ScaleTransform> 
        <ScaleTransform.ScaleX> 
        <MultiBinding Converter="{StaticResource ScaleConverter}"> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type Button}}" Path="ActualWidth" /> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type TextBlock}}" Path="ActualWidth" /> 
        </MultiBinding> 
        </ScaleTransform.ScaleX> 
        <ScaleTransform.ScaleY> 
        <MultiBinding Converter="{StaticResource ScaleConverter}"> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type Button}}" Path="ActualHeight" /> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type TextBlock}}" Path="ActualHeight" /> 
        </MultiBinding> 
        </ScaleTransform.ScaleY> 
       </ScaleTransform> 
      </TextBlock.RenderTransform> 
     </TextBlock> 
    </Button 

và phần mềm convert

public class ScaleConverter : IMultiValueConverter 
{ 
    #region Implementation of IMultiValueConverter 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((double) values[0])/((double) values[1]); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 
+0

Cảm ơn bạn Phil, giải pháp đầu tiên hoạt động hoàn hảo! – agnes

Các vấn đề liên quan