2011-09-13 84 views
27

我有一個wpf窗口,其中我有一個帶有兩個視口的堆疊面板 - 每個視口都帶有一個文本塊。如何讓WPF TextBlock在多行上顯示我的文本?

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

什麼,我想實現的是,頂部文本塊是一個更大的文字標題。第二個文本塊是文本較小的子標題。無論標題或子標題有多少文字,字體都應該動態變小/變大。我的問題是,我希望子標題的寬度是固定的。這意味着,字體應該是標題的一個百分比(70%),並換行爲多行,具體取決於我擁有多少文本。我附上了我迄今爲止的代碼...我錯過了那個小標題,不知道是什麼。乾杯

編輯 基本上我想達到什麼是子頭包裝了文本,因此它可以通過字體爲標題的70%向下展開 - 無論字體是有多大。

+0

什麼是動態調整大小的規則/方程。好的,這個分數是70%,但是如何確定第一個?如果你想爲第二個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相關。目前這隻適用於原始渲染。我無法弄清楚如何將Converter註冊爲resize事件。實際上可能需要將FontSize註冊爲resize事件。請不要將我標記爲不完整的答案。我無法將代碼示例放入評論中。

<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

這是我的答案。謝謝。 –

相關問題