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