Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .ScaleControl的WPF版本?_C#_Wpf_Winforms_Scaling_User Preferences - Fatal编程技术网

C# .ScaleControl的WPF版本?

C# .ScaleControl的WPF版本?,c#,wpf,winforms,scaling,user-preferences,C#,Wpf,Winforms,Scaling,User Preferences,什么是WPF版本的 我试图通过将字体设置为以下值来尊重用户的字体偏好: 与WinForms不同,表单的内容不随字体更改而缩放: 之前 之后(坏) 实际上,表单上的所有控件(包括按钮的大小、listview列的宽度等)都应缩放以匹配新布局: 之后(好) 由于WPF不()响应字体大小的更改,因此我打算通过自己尝试缩放WPF表单来解决这个问题,使用假设的WPF版本: 想要缩放控件(和所有子控件)的另一个例子是,当我需要缩放控件(和所有子控件)以适应给定的大小时。在这种情况下,我不想缩放整个表

什么是WPF版本的


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

与WinForms不同,表单的内容不随字体更改而缩放:

之前

之后(坏)

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

之后(好)

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



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

这个解决方案怎么样

<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>

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

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


另请参见:

我不明白问题是什么?@Navid Rahmani:缩放控件(以及所有子控件)时使用的WPF方法是什么?我不希望元素像其内容那样大。e、 g.listview列的宽度可以是120px。如果listview的字体变大11%,那么该列的宽度应该是133px(120px*111%=133.2px),这是什么意思?有哪些注意事项?这个描述(定义了一个内容装饰器,它可以拉伸和缩放一个孩子来填充可用的空间。)听起来很符合我的风格。@Ian-看看我在答案中添加的链接。如果使用得太多,会有一些性能上的问题(你必须用谷歌搜索它——我手头没有来源)。这就是说,即使您只使用了一点点,您可能会发现最终您希望更好地控制较小的区域(有时缩放字体在您的UI上下文中看起来不太正确,或者如果您使用不同的视口,您会在同一UI上为同一控件获得不同大小的字体,等等)。你能做的最好的事情就是尝试一下,看看它是否符合你的要求。(例如:如果它有效,很好!如果不行,你还有更多的工作要做。):@Wonko the Sane:别看我!在今晚晚些时候有机会尝试之前,我没有投赞成票,也没有投反对票。虽然从技术上讲,告诉我查看框的存在是“有用的”。哦,我不是想责怪你…:)我可以接受否决票(否则我就不会成为会员)。然而,我不理解在没有解释的情况下否决一个问题——没有机会改进答案。
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;
}
<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;
}