Xamarin.Forms 图像缩放挑战

Xamarin.Forms Image scaling challenge

我有一个有按钮行的应用程序。 我希望它在宽屏幕上看起来不错,但在纵向模式下的窄手机上也很好看。

这些是可以显示的按钮的最大数量。

我要

我尝试了多种布局组合,这是我最接近实现目标的组合。 在当前状态下,当它变​​得太窄时,它只调整最后一张图像的大小,如果按钮不可见,黄色部分不会正确居中。

我主要想知道如何确定要缩小哪些图像以使其适合,以及如何确保所有图像都被缩小。

<Grid Grid.Row="1" BackgroundColor="#0c2442" Padding="5" ColumnSpacing="10" HeightRequest="64">
       ​
           ​<Grid.ColumnDefinitions>
               ​<ColumnDefinition Width="*"></ColumnDefinition>
               ​<ColumnDefinition Width="Auto"></ColumnDefinition>
               ​<ColumnDefinition Width="*"></ColumnDefinition>
           ​</Grid.ColumnDefinitions>
       ​
       ​<Image Grid.Column="0" Source="home_blue.png" Aspect="AspectFit" HorizontalOptions="StartAndExpand" BackgroundColor="Aqua"></Image>

       ​<Grid Grid.Column="1" HorizontalOptions="CenterAndExpand" ColumnSpacing="10" BackgroundColor="Yellow">
           ​<Grid.ColumnDefinitions>
               ​<ColumnDefinition Width="{Binding ArrowLeftVisible, Converter={StaticResource MyBoolToAutoGridLengthConverter}}"></ColumnDefinition>
               ​<ColumnDefinition Width="{Binding PlayOrPauseButtonVisible, Converter={StaticResource MyBoolToAutoGridLengthConverter}}"></ColumnDefinition>
               ​<ColumnDefinition Width="{Binding ArrowRightVisible, Converter={StaticResource MyBoolToAutoGridLengthConverter}}"></ColumnDefinition>
           ​</Grid.ColumnDefinitions>

           ​<Image Grid.Column="0" Source="arrow_left_blue.png" Aspect="AspectFit" IsVisible="{Binding ArrowLeftVisible}" HorizontalOptions="End"></Image>
           ​<Image Grid.Column="1" Source="play_blue.png" Aspect="AspectFit" IsVisible="{Binding PlayButtonVisible}"></Image>
           ​<Image Grid.Column="1" Source="pause_blue.png" Aspect="AspectFit" IsVisible="{Binding PauseButtonVisible}"></Image>
           ​<Image Grid.Column="2" Source="arrow_right_blue.png" Aspect="AspectFit" IsVisible="{Binding ArrowRightVisible}" HorizontalOptions="Start"></Image>
       ​</Grid>


       ​<Grid Grid.Column="2" HorizontalOptions="EndAndExpand" ColumnSpacing="10" BackgroundColor="Green">
           ​<Grid.ColumnDefinitions>
               ​<ColumnDefinition Width="Auto"></ColumnDefinition>
               ​<ColumnDefinition Width="Auto"></ColumnDefinition>
           ​</Grid.ColumnDefinitions>
           ​<Image Grid.Column="0" Source="textcontrols_blue.png" Aspect="AspectFit" IsVisible="{Binding ShowBookTextSettingsButtonVisible}"></Image>
           ​<Image Grid.Column="1" Source="showtext_blue.png" Aspect="AspectFit" IsVisible="{Binding ShowTextButtonVisible}"></Image>
           ​<Image Grid.Column="1" Source="showtext_active_blue.png" Aspect="AspectFit" IsVisible="{Binding HideTextButtonVisible}"></Image>
       ​</Grid>
   ​</Grid>

为了说明我在这里面临的问题是测试的结果。在这里,我在绿色部分添加了第三张图片(只是因为我的应用程序的 UWP 版本,我更喜欢在其中进行开发,不允许我将 window 拖动得比我想完全看到效果的要小) . 您可以看到绿色部分中的右侧图像正在调整大小,黄色部分中的左右箭头(但速率不同)和其他图像保持相同的高度。我不明白为什么只有这些图像在调整大小。

本次测试使用以下代码

        <Grid Grid.Row="1" BackgroundColor="#0c2442" Padding="5" ColumnSpacing="10" HeightRequest="64">
        
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*"></ColumnDefinition>
                <ColumnDefinition Width="3*"></ColumnDefinition>
                <ColumnDefinition Width="3*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

        <Grid Grid.Column="0" BackgroundColor="Aqua">
            <Image  Source="home_blue.png" Aspect="AspectFit" HorizontalOptions="StartAndExpand" >
                <Image.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding GoToHomeCommand}" />
                </Image.GestureRecognizers>
            </Image>
        </Grid>

        <Grid Grid.Column="1"  ColumnSpacing="10" BackgroundColor="Yellow" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>                    
            </Grid.ColumnDefinitions>

            <Image Grid.Column="0" Source="arrow_left_blue.png" Aspect="AspectFit" IsVisible="{Binding ArrowLeftVisible}" HorizontalOptions="End"></Image>
            <Image Grid.Column="1" Source="play_blue.png" Aspect="AspectFit" IsVisible="{Binding PlayButtonVisible}"></Image>
            <Image Grid.Column="1" Source="pause_blue.png" Aspect="AspectFit" IsVisible="{Binding PauseButtonVisible}"></Image>
            <Image Grid.Column="2" Source="arrow_right_blue.png" Aspect="AspectFit" IsVisible="{Binding ArrowRightVisible}" HorizontalOptions="Start"></Image>
        </Grid>
        <Grid Grid.Column="2" ColumnSpacing="10" BackgroundColor="Green" HorizontalOptions="End">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Image Grid.Column="0" Source="textcontrols_blue.png" Aspect="AspectFit" IsVisible="{Binding ShowBookTextSettingsButtonVisible}"></Image>
            <Image Grid.Column="1" Source="showtext_blue.png" Aspect="AspectFit" IsVisible="{Binding ShowTextButtonVisible}"></Image>
            <Image Grid.Column="2" Source="textcontrols_blue.png" Aspect="AspectFit" IsVisible="{Binding ShowBookTextSettingsButtonVisible}"></Image>
        </Grid>
    </Grid>

感谢@Jason 的建议。 我通过手动计算大小并绑定到计算的大小来解决这个问题。