7

我有一个Viewbox带有许多TextBlocks 的 s ,这些 s 由ViewBox. 像这样的东西:

<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无论Viewbox.

我怎样才能做到这一点?我可以在 XAML 中执行此操作而不附加到Resize事件吗?

4

2 回答 2

12

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>

请注意,我从 中删除了 Width 属性TextBlock,我只是让它拉伸到网格的宽度,让文本对齐来处理居中。

或者,您可以发挥创意并将FontSize属性绑定到ActualWidthViewBox并使其适当缩放,例如:

转换器:

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>
于 2010-01-06T15:25:32.153 回答
7

这也可能是一个简单的修复。

<Viewbox StretchDirection="DownOnly" >
     <Label Content="Enable" FontSize="10" FontStretch="Normal" />
</Viewbox>
于 2015-03-04T14:31:06.893 回答