UWP控件如何锁定长宽比

在UWP界面设计的过程中,有时候我们需要锁定一些控件的长宽比,但又需要自动调整控件的大小。控件并没有直接实现锁定长宽比的功能,但只需要简单的代码即可实现自动缩放的情况下锁定长宽比。

下面这一段代码表现的是一个布局复杂的按钮控件。这个版本中,按钮sampleButton的长宽比会随着窗口长宽比改变。

<Page
    x:Class="App2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="sampleButton" 
                VerticalAlignment="Stretch" 
                HorizontalAlignment="Stretch"
                Grid.Row="1"
                Grid.Column="1"/>
    </Grid>
</Page>
原版效果图

说明:以下描述最简单的OnSizeChanged的方法。如果是自定义的控件需要实现长宽比锁定,可以重载其Measure方法。重载Measure方法的性能更高。具体方式见控件UI性能调优

我们想要让这个按钮锁定在正方形。很简单,只需要在Button外面再套一个Grid,再监听其SizeChanged事件:

<Button x:Name="sampleButton" 
                VerticalAlignment="Stretch" 
                HorizontalAlignment="Stretch"
                Grid.Row="1"
                Grid.Column="1"/>

改为

        <Grid x:Name="sampleButtonFrame"
              Grid.Row="1"
              Grid.Column="1"
              SizeChanged="sampleButtonFrame_SizeChanged">
            <Button x:Name="sampleButton"
                    VerticalAlignment="Stretch"
                    HorizontalAlignment="Stretch"/>
        </Grid>

然后在后台代码中添加如下函数:

        private void sampleButtonFrame_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            if (e.NewSize.Width > e.NewSize.Height)
            {
                sampleButton.Width = e.NewSize.Height;
                sampleButton.Height = double.NaN;
            }
            else
            {
                sampleButton.Width = double.NaN;
                sampleButton.Height = e.NewSize.Width;
            }
        }

这样,在调整窗口大小时,按钮就能始终保持正方形了。如果需要其他比例,只需要稍微修改后台代码即可。

锁定在正方形的效果图

留言

有想法?请给我们留言!您的留言不会直接显示在网站内。