2011-09-13 7 views
27

私はそこに2つのビューポートを持つスタックパネルを持っているwpfウィンドウを持っています - それぞれのビューポートにはテキストブロックがあります。複数の行にテキストを表示するにはどうすればよいですか?

<Grid> 
    <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
     <Viewbox Margin="100,0,100,0"> 
      <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
     </Viewbox> 
     <Viewbox Margin="150,0,150,0"> 
      <TextBlock x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
     </Viewbox> 
    </StackPanel> 
</Grid> 

私が達成したいのは、上部のテキストブロックが大きなテキストの見出しであることです。 2番目のテキストブロックは、小さなテキストのサブ見出しです。見出しまたは小見出しにどれだけのテキストがあっても、フォントは動的に小さくなる必要があります。私の問題は、小見出しを固定幅にしたいということです。これは、フォントの見出しの割合(70%)であり、テキストの量に応じて複数の行に折り返すことを意味します。私はこれまでに持っているコードを封じ込めました...その小見出しで何かを見つけられませんでした。乾杯

編集 基本的に私が達成したいか、それはフォントは見出しの70%であることを下向きにして展開することはできませんので、サブヘッダーテキストをラップしていることである - に関係なく、そのフォントがどのように大きいです。

+0

ダイナミックなサイズ変更のためのルール/方程式である何を。 OKサブは70%ですが、どのように最初のサイズにするのですか? 2番目のTextBlockの幅を固定したい場合は、幅を設定します。 – Paparazzi

+0

これは、画面のサイズや解像度がわからない環境での使用です。幅は余白を使って設定されるので、すべての画面で同じように動作することができます。見出しのサイズはビューポートによって決まります。つまり、テキストブロックは常に最大サイズで表示されます。 - 再び画面の解像度に応じて。 –

答えて

56

のStackPanelを入れ子にすると、テキストボックスが適切にラップするようになります:

<Viewbox Margin="120,0,120,0"> 
    <StackPanel Orientation="Vertical" Width="400"> 
     <TextBlock x:Name="subHeaderText" 
        FontSize="20" 
        TextWrapping="Wrap" 
        Foreground="Black" 
        Text="Lorem ipsum dolor, lorem isum dolor,Lorem ipsum dolor sit amet, lorem ipsum dolor sit amet " /> 
    </StackPanel> 
</Viewbox> 
+6

これで問題は解決しますか?固定幅と固定正面サイズは問題文と矛盾しているようです。 – Paparazzi

+1

@Blam - テキストを折り返したい場合はMaxWidthを使用できますが、幅未満の場合は余分なスペースを必要としません。 – Robotnik

3

これが途中で取得します。 ActualFontSizeプロパティはありませんが、ActualHeightがあり、FontSizeに関連しています。今は、元のレンダーのサイズのみです。 ResizeイベントとしてConverterを登録する方法を理解できませんでした。実際には、FontSizeをサイズ変更イベントとして登録する必要があります。私に不完全な答えを記してください。コメントにコードサンプルを入れることができませんでした。

<Window.Resources> 
     <local:WidthConverter x:Key="widthConverter"/> 
    </Window.Resources> 
    <Grid> 
     <Grid> 
      <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
       <Viewbox Margin="100,0,100,0"> 
        <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
       </Viewbox> 
       <TextBlock Margin="150,0,150,0" FontSize="{Binding ElementName=headerText, Path=ActualHeight, Converter={StaticResource widthConverter}}" x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
      </StackPanel> 
     </Grid> 
    </Grid>   

コンバータ

[ValueConversion(typeof(double), typeof(double))] 
    public class WidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      double width = (double)value*.7; 
      return width; // columnsCount; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
2

あなただけ残り、その後少し大きめあなたのヘッダーのフォントを持っているしたい場合は、ScaleTransformを使用することができます。実際のフォントサイズには依存しません。

<TextBlock x:Name="headerText" Text="Lorem ipsum dolor"> 
       <TextBlock.LayoutTransform> 
        <ScaleTransform ScaleX="1.1" ScaleY="1.1" /> 
       </TextBlock.LayoutTransform> 
    </TextBlock> 
20

TextBlock要素のプロパティTextWrapping使用します。

<TextBlock Text="StackOverflow Forum" 
      Width="100" 
      TextWrapping="WrapWithOverflow"/> 
+1

これは私の答えです。どうも。 –

関連する問題