WPF字体缩放

gjmwrych  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(248)

我有一个WPF应用程序,其中的用户界面应该进行缩放,以便当窗口变大时,用户界面也会变大。在其中一个对话框中,我需要向用户展示一个项目列表,用户应该点击其中一个。列表将包含1到15-20个项目。希望每个项目的字号与列表中其他项目的字号一样大,但同时希望窗口变大时字号也相应增大。
目前,我的测试代码如下所示。

<Window x:Class="WpfApplication4.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="clr-namespace:WpfApplication4"
    Title="Window1" Height="480" Width="640">

    <ScrollViewer>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30*" MinHeight="30"/>
                <RowDefinition Height="30*" MinHeight="30"/>
                <RowDefinition Height="30*" MinHeight="30"/>
            </Grid.RowDefinitions>

            <Button Grid.Row="0" MaxHeight="100"><Viewbox><TextBlock>T</TextBlock></Viewbox></Button>
            <Button Grid.Row="1" MaxHeight="100"><Viewbox><TextBlock>Test</TextBlock></Viewbox></Button>
            <Button Grid.Row="2" MaxHeight="100"><Viewbox><TextBlock>Test Longer String</TextBlock></Viewbox></Button>

        </Grid>

    </ScrollViewer>

</Window>

如果应用程序启动并且窗口变宽,则一切看起来都正常。如果窗口宽度减小,则文本Test Longer String的字体大小变小,但是TTest的字体大小保持不变。我确实理解为什么会发生这种情况-ViewBox会将内容缩放到其最大大小。我想知道的是我应该用什么方法来解决这个问题
我不想给控件指定特定的字体大小,因为有些人会在低分辨率屏幕(如640 x480)上运行此控件,而其他人会使用更大的宽屏。

编辑:

我尝试将代码修改为以下内容:

<ScrollViewer>
    <Viewbox>
        <ItemsControl>
            <Button>Test 2</Button>
            <Button>Test 3</Button>
            <Button>Test 4 afdsfdsa fds afdsaf</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
        </ItemsControl>
    </Viewbox>
</ScrollViewer>

但是随着按钮边框的尺寸也增加了,所以在大屏幕上,按钮边框变成了一厘米宽。

axr492tv

axr492tv1#

尝试以下操作:像往常一样渲染文本项目:

  • TextBlock是否包含在“ItemsControl”中?
  • ListBox

将整个模型放入ViewBox中,并根据您的需要进行适当的缩放。查找水平、垂直或组合缩放属性。

olqngx59

olqngx592#

此解决方法可能有助于:

<ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30*" MinHeight="30"/>
            <RowDefinition Height="30*" MinHeight="30"/>
            <RowDefinition Height="30*" MinHeight="30"/>
        </Grid.RowDefinitions>

        <Button Grid.Row="0" MaxHeight="100">
            <Viewbox>
                <TextBlock Width="{Binding ElementName=tbLonger,Path=ActualWidth}">T</TextBlock>
            </Viewbox>
        </Button>
        <Button Grid.Row="1" MaxHeight="100">
            <Viewbox>
                <TextBlock Width="{Binding ElementName=tbLonger,Path=ActualWidth}">Test</TextBlock>
            </Viewbox>
        </Button>
        <Button Grid.Row="2" MaxHeight="100">
            <Viewbox>
                <TextBlock Name="tbLonger">Test Longer String</TextBlock>
            </Viewbox>
        </Button>
    </Grid>
</ScrollViewer>

关键是将所有文本块设置为相同的宽度。在这种情况下,它们都通过绑定跟随最长的文本块。

a0x5cqrl

a0x5cqrl3#

我不得不制作一个分辨率独立的应用程序,并在这里给出了以下答案:tips on developing resolution independent application
您的应用程序根据分辨率进行缩放。

9fkzdhlc

9fkzdhlc4#

最简单的方法可能是构造一个装饰器来完成这项工作,你可以称之为“VerticalStretchDecorator”或类似的东西。
以下是它的使用方法:

<UniformGrid Rows="3" MaxHeight="300">
  <Button>
    <my:VerticalStretchDecorator>
      <TextBlock>T</TextBlock>
    </my:VerticalStretchDecorator>
  </Button> 
  <Button>
    <my:VerticalStretchDecorator>
      <TextBlock>Test</TextBlock>
    </my:VerticalStretchDecorator>
  </Button> 
  <Button>
    <my:VerticalStretchDecorator>
      <TextBlock>Test Longer String</TextBlock>
    </my:VerticalStretchDecorator>
  </Button>
</UniformGrid>

我使用了UniformGrid而不是Grid,但它与Grid的工作方式相同。
它的实现方式如下:

public class VerticalStretchDecorator : Decorator
{
  protected override Size MeasureOverride(Size constraint)
  {
    var desired = base.Measure(constraint);
    if(desired.Height > constraint.Height || desired.Height==0)
      LayoutTransform = null;
    else
    {
      var scale = constraint.Height / desired.Height;
      LayoutTransform = new ScaleTransform(scale, scale); // Stretch in both directions
    }
  }
}

相关问题