【问题标题】:WPF version of .ScaleControl?.ScaleControl 的 WPF 版本?
【发布时间】:2011-06-21 02:32:20
【问题描述】:

Control.ScaleControl 的 WPF 版本是什么?


我试图通过将字体设置为IconTitleFont 来尊重用户的字体偏好:

private void ApplyUserFontPreferences()
{
   this.FontFamily = SystemFonts.IconFontFamily;
   this.FontSize = SystemFonts.IconFontSize;
   this.FontStyle = SystemFonts.IconFontStyle;
   this.FontWeight = SystemFonts.IconFontWeight;
}

与 WinForms 不同,表单的内容不会随着字体的变化而缩放:

之前

之后(糟糕)

实际上,表单上的所有控件(包括按钮的大小、列表视图列的宽度等)都应该缩放以匹配新的布局:

之后(好)

由于 WPF 不 (unlike WinForms) 响应字体大小的变化,我打算通过尝试自己缩放 WPF 表单来解决这个问题,使用假设的 WPF 版本ScaleControl

private void ApplyUserFontPreferences()
{
   Double scaleFactor = (SystemFonts.IconFontSize / this.FontSize); //i.e. new / old
   this.ScaleControl(scaleFactor); //doesn't exist

   this.FontFamily = SystemFonts.IconFontFamily;
// this.FontSize = SystemFonts.IconFontSize;
   this.FontStyle = SystemFonts.IconFontStyle;
   this.FontWeight = SystemFonts.IconFontWeight;
}

想要缩放控件(和所有子控件)的另一个示例是当我需要缩放控件(和所有子控件)以适应给定大小时。在这种情况下,我不想缩放整个表单,我只想缩放特定控件。

【问题讨论】:

  • 我不明白这是什么问题?
  • @Navid Rahmani:用于缩放控件(以及所有子控件)的 WPF 方法是什么?

标签: c# wpf winforms scaling user-preferences


【解决方案1】:

这个解决方案怎么样

<Window
   x:Class="WpfApplication1.MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   FontSize="40"
   Loaded="Window_Loaded"
   SizeToContent="WidthAndHeight"
   Title="MainWindow">

   <Grid x:Name="LayoutRoot" Width="525" Height="350">
      <Button Width="300" Height="60" Content="Hello world"/>
      <Grid.LayoutTransform>
         <ScaleTransform x:Name="scaleTransform"/>
      </Grid.LayoutTransform>
   </Grid>
</Window>

在后面的代码中

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ApplyUserFontPreferences();
}

private void ApplyUserFontPreferences(){ 
    Double scaleFactor = (SystemFonts.IconFontSize / this.FontSize);

    this.scaleTransform.ScaleX = scaleFactor;
    this.scaleTransform.ScaleY = scaleFactor;       

    this.FontFamily = SystemFonts.IconFontFamily; 
    this.FontStyle = SystemFonts.IconFontStyle;
    this.FontWeight = SystemFonts.IconFontWeight;
}

【讨论】:

  • 我不希望元素与其内容一样大。例如listview 列可以是 120px 宽。如果列表视图的字体变大 11%,那么列应该是 133px 宽(120px * 111% = 133.2px)
【解决方案2】:

我不确定它是否完全符合您的要求,但 WPF 确实包含自动缩放控件:Viewbox

这有点笨拙,所以 YMMV。最终,您可能会发现您需要更精确的控制,因此您必须在设计模板等时小心谨慎。不过,Viewbox 将为您提供一些基本的缩放功能。

另见:Resolution Independance in WPF

【讨论】:

  • 你是什么意思重手?它有哪些注意事项?描述(定义了一个可以拉伸和缩放单个子元素以填充可用空间的内容装饰器。)听起来很合我的胃口。
  • @Ian - 查看我添加到答案中的链接。如果使用过多,会有一些性能损失(你必须谷歌它 - 我没有临时来源)。话虽如此,即使您只使用了一点点,您可能会发现最终您希望更好地控制较小的区域(有时缩放的字体在您的 UI 上下文中看起来不太正确,或者如果您使用不同的 Viewbox,您会在相同的 UI 上为相同的控件获得不同大小的字体等)。你能做的最好的就是尝试一下,看看它是否符合你的要求。
  • (即:如果它有效,那太好了!如果无效,您还有更多工作要做。):)
  • @Wonko the Sane:别看我!我没有投赞成票,也没有投反对票,直到今晚晚些时候我有机会尝试。尽管从技术上告诉我Viewbox 的存在是“有用的”。
  • 哦,我不是想责怪你... :) 我可以接受反对票(否则我不会成为会员)。但是,我不理解在没有解释的情况下对问题投反对票 - 没有机会改进答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2021-12-31
  • 2020-05-09
相关资源
最近更新 更多