我有一个带有多个标签和其他控件的WPF UI。我希望标签内文本的大小与窗口大小成比例。
将标签放入Viewbox中是我想要的,但是我觉得将每个标签放入其自己的Viewbox中有点“不协调”。
<Viewbox Grid.Row="1">
<Label>PA-Nummer</Label>
</Viewbox>
是否只有Xaml(与MVVM模式一起使用)方法才能更有效地做到这一点?
答案 0 :(得分:-1)
如果要缩放整个内容(而不仅仅是文本),可以执行以下操作。假设您对Window
(名为MyWindow
)的顶级控制是Grid
,那么这就是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>
这里是转换器,假定宽度为640是正常(1:1)比例:
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;
}
}
更新:但是,上述解决方案只会使字体大小(和控件)出现更大,但实际上并不会改变字体大小。如果只想更改Label
控件的字体大小,则可以在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>
转换器假定宽度640对应于字体大小12.0,并相应缩放:
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;
}
}
您可以添加类似的Style
资源以缩放其他控件的字体大小。但是,即使控件派生自Control
类,您也无法通过这种方式为所有控件定义Style
。但是,有一种解决方法here。