2010-01-06 47 views
7

我有一個ViewboxTextBlock的數量,這是由ViewBox縮放和定位完美。事情是這樣的:如何在WPF視圖框中保持常量FontSize?

<Viewbox Stretch="Uniform"> 
    <Canvas Width="100" Height="100"> 
     <Ellipse Width="100" Height="100" Stroke="Black"/> 
     <TextBlock Width="100" TextAlignment="Center" FontSize="12">Top Center</TextBlock> 
    </Canvas> 
</Viewbox> 

如果用戶改變Viewbox它的內容是完全按比例匹配。但是我想保留FontSize爲12,而不管Viewbox的實際大小。

我該怎麼做?我可以在不附加到Resize事件的情況下在XAML中執行此操作嗎?

回答

10

ViewBox不允許你保持一個固定的字體大小,這只是它不是如何工作的。你需要把文本視圖框外要做到這一點:

<Grid> 
    <Viewbox Stretch="Uniform"> 
     <Canvas Width="100" Height="100"> 
      <Ellipse Width="100" Height="100" Stroke="Black"/> 
     </Canvas> 
    </Viewbox> 
    <TextBlock TextAlignment="Center" FontSize="12">Top Center</TextBlock> 
</Grid> 

注意,我從TextBlock刪除Width屬性,我就讓它伸展網格的寬度,讓文本對齊取關心中心。

或者,你可以發揮創意並綁定FontSize屬性爲ViewBoxActualWidth並讓它適當比例,例如:

轉換器:

class ViewBoxConstantFontSizeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is double)) return null; 
     double d = (double)value; 
     return 100/d * 12; 
    } 

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

用法:

<Window.Resources> 
    ... 
    <local:ViewBoxConstantFontSizeConverter x:Key="conv"/> 
</Window.Resources> 
... 
<Viewbox Name="vb" Stretch="Uniform"> 
    <Canvas Width="100" Height="100"> 
     <Ellipse Width="100" Height="100" Stroke="Black"/> 
     <TextBlock Width="100" TextAlignment="Center" 
        FontSize="{Binding ElementName=vb, 
             Path=ActualWidth, 
             Converter={StaticResource conv}}"> 
      Top Center 
     </TextBlock> 
    </Canvas> 
</Viewbox> 
+1

謝謝。我想我簡化了我的例子太多了。我需要Viewbox來處理我的文本的位置,但不是它的FontSize。 – Hallgrim 2010-01-06 21:12:17

+1

爲我的答案增加了一個替代方案,試試吧。這有點過度創意,但它可能工作:) – 2010-01-06 21:21:33

+0

令人印象深刻!這工作,但我希望有一些更簡單。 – Hallgrim 2010-01-08 21:40:40

7

這可能也很簡單。

<Viewbox StretchDirection="DownOnly" > 
    <Label Content="Enable" FontSize="10" FontStretch="Normal" /> 
</Viewbox>