C# 有没有更优雅的方法来自动调整标签字体大小?

C# 有没有更优雅的方法来自动调整标签字体大小?,c#,wpf,resize,C#,Wpf,Resize,我有一个WPF UI,其中有几个标签和其他控件。我希望标签内文本的大小与窗口大小成比例 将标签放在Viewbox中符合我的要求,但我觉得将每个标签放在它自己的Viewbox中有点“不舒服” 巴努默 是否有一种仅使用Xaml(使用MVVM模式)的方法可以更有效地实现这一点?如果您希望扩展整个内容(而不仅仅是文本),可以执行以下操作。假设您对窗口(名为MyWindow)的顶级控制是一个网格,下面是XAML: <Window.Resources> <c:WindowWid

我有一个WPF UI,其中有几个标签和其他控件。我希望标签内文本的大小与窗口大小成比例

将标签放在Viewbox中符合我的要求,但我觉得将每个标签放在它自己的Viewbox中有点“不舒服”


巴努默

是否有一种仅使用Xaml(使用MVVM模式)的方法可以更有效地实现这一点?

如果您希望扩展整个内容(而不仅仅是文本),可以执行以下操作。假设您对
窗口
(名为
MyWindow
)的顶级控制是一个
网格
,下面是XAML:

<Window.Resources>
    <c:WindowWidthToScaleConverter x:Key="WindowWidthToScaleConverter" />
</Window.Resources>

<Grid>
    <Grid.LayoutTransform>
        <ScaleTransform
            ScaleX="{Binding ActualWidth, ElementName=MyWindow, Converter={StaticResource WindowWidthToScaleConverter}}"
            ScaleY="{Binding ActualWidth, ElementName=MyWindow, Converter={StaticResource WindowWidthToScaleConverter}}"
            />
    </Grid.LayoutTransform>
    <!-- Contents -->
</Grid>
更新:但是,上述解决方案只会使字体大小(和控件)看起来更大,但实际上不会更改字体大小。如果只想更改
标签
控件的字体大小,可以在XAML中执行以下操作:

<Window.Resources>
    <c:WindowWidthToFontSizeConverter x:Key="WindowWidthToFontSizeConverter" />
    <Style TargetType="Label">
        <Setter
            Property="FontSize"
            Value="{Binding ActualWidth, ElementName=MyWindow,
                Converter={StaticResource WindowWidthToFontSizeConverter}}"
            />
    </Style>
</Window.Resources>

<StackPanel>
    <Label Content="Name:" />
    <TextBox />
</StackPanel>

您可以添加类似的
Style
资源来缩放其他控件的字体大小。但是,即使控件派生自
控件
类,也不能以这种方式为所有控件定义
样式
。但是,对此有一个解决办法。

您可以使用
模板中的
视图框
标签
-
控件
创建隐式
样式
。您可以将窗口的全部内容放在视图框中。顺便说一句,这似乎是一个不寻常的要求。@Andy工作起来很有魅力。谢谢为什么文本要随窗口缩放是一个不寻常的要求?在缩放此页面时会发生这种情况吗?或word或excel。。。。或者差不多什么?图形应用程序就是这样,但商业应用程序就不是这样了。好吧,这是一个面向生产工人的应用程序,所有元素都应该随时可见,无需滚动,元素应该尽可能大。我明白你的意思,在日常桌面应用程序中,这可能确实不常见,但在工业和生产前端,这并不是我第一次看到这样的行为。我尝试过,但标签文本的字体大小保持不变。是的,字体大小的外观保持不变,但实际的
FontSize
保持不变。我已经用一个扩展
FontSize
的解决方案更新了我的答案。对不起,我的评论措辞不好。我的意思是,它在屏幕上也不会显得更大。然而,安迪在我的作品评论中提出的解决方案却起到了作用。谢谢你。
public class WindowWidthToScaleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double width)
            return width / 640.0;
        return 1.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}
<Window.Resources>
    <c:WindowWidthToFontSizeConverter x:Key="WindowWidthToFontSizeConverter" />
    <Style TargetType="Label">
        <Setter
            Property="FontSize"
            Value="{Binding ActualWidth, ElementName=MyWindow,
                Converter={StaticResource WindowWidthToFontSizeConverter}}"
            />
    </Style>
</Window.Resources>

<StackPanel>
    <Label Content="Name:" />
    <TextBox />
</StackPanel>
public class WindowWidthToFontSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double width)
            return 12.0 * width / 640.0;
        return 12.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}