C# 根据屏幕尺寸调整对象大小

C# 根据屏幕尺寸调整对象大小,c#,xaml,xamarin.forms,C#,Xaml,Xamarin.forms,给定不同的屏幕大小,用户界面的缩放方法是什么 在设置UI时,它在一个屏幕上看起来很棒,但在另一个屏幕上却很糟糕。尝试根据屏幕尺寸设置可能的动态样式。这里有一个简单的标题,标签中有一个格式化字符串。我想使整个标签居中,跨距格式保持不变。理想情况下,我希望将文本的高度设置为当前.MainPage.height的某个百分比 来自App.xaml <Application.Resources> <ResourceDictionary> <Style

给定不同的屏幕大小,用户界面的缩放方法是什么

在设置UI时,它在一个屏幕上看起来很棒,但在另一个屏幕上却很糟糕。尝试根据屏幕尺寸设置可能的动态样式。这里有一个简单的标题,标签中有一个格式化字符串。我想使整个标签居中,跨距格式保持不变。理想情况下,我希望将文本的高度设置为当前.MainPage.height的某个百分比

来自App.xaml

<Application.Resources>
    <ResourceDictionary>
        <Style x:Key="HeaderSpans" TargetType="Span" >
            <Setter Property="BackgroundColor" Value="Transparent"></Setter>
            <Setter Property="HorizontalOptions" Value="Center"></Setter>
            <Setter Property="TextColor" Value="White"></Setter>
            <Setter Property="VerticalTextAlignment" Value="Center"></Setter>
            <Setter Property="Margin" Value="0, 20, 0, 0"></Setter>
        </Style>
        <Style x:Key="HeaderSpan" TargetType="Span" >
            <Setter Property="TextColor" Value="White"></Setter>
            <Setter Property="FontSize" Value="32"></Setter>

        </Style>
        <Style x:Key="HeaderSpanB" TargetType="Span" >
            <Setter Property="TextColor" Value="White"></Setter>
            <Setter Property="FontSize" Value="32"></Setter>
            <Setter Property="FontAttributes" Value="Bold"></Setter>
        </Style>
    </ResourceDictionary>
</Application.Resources>
我想我也许可以利用这个代码来做这件事。但我不知道如何从那里影响风格。我认为二传手可能是正确的道路。我没有取得实质性进展

来自Header.xaml


没有代码隐藏


如果有人能给我提供正确的解决方案,我将不胜感激

如果要根据平台更改UI的值,可以使用“on platform”语句。 例如,如果您希望iOS上的网格与Android上的网格具有不同的余量,您可以这样使用:

<Grid>
    <Grid.Margin>
        <On Platform x:TypeArguments="Thickness">
            <On Platform="iOS">0,0,0,0</On>
            <On Platform="Android">15,0,15,0</On>
        </OnPlatform>
    </Grid.Margin>
</Grid>
在android实现中,添加界面的实现:

获取屏幕尺寸-Android

ScreenDimensions.cs

获取屏幕尺寸-iOS

ScreenDimensions.cs

构建值转换器以使用屏幕尺寸

        switch (Device.RuntimePlatform)
        {
            case Device.iOS:
                //MainPage.BackgroundColor = Color.Black;
                break;
            case Device.Android:
                //MainPage.BackgroundColor = Color.Red;
                break;
            case Device.UWP:
                //MainPage.BackgroundColor = Color.Orange;
                break;
            default:
                //MainPage.BackgroundColor = Color.Transparent;
                break;
        }
现在我们创建一个IValueConverter(同样在共享代码中):

screensizetorelativesesizeconverter.cs

公共类ScreenSizeToRelativeSeizeConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
double height=DependencyService.Get().GetScreenHeight();
返回(双)高*(双)参数;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
//不需要将任何东西转换回来
抛出新的NotImplementedException();
}
}
请注意,转换器需要一个参数来告诉它最终得到的屏幕大小的哪一部分

将所有内容放在一起

最后,将以下资源添加到App.xaml文件中:

<Application.Resources>
    <ResourceDictionary>
        <converter:ScreenSizeToRelativeSizeConverter x:Key="SizeToRelativeSizeConverter"/>
        <x:Double x:Key="fontSizeFactor">0.03</x:Double>
        <Style x:Key="LabelStyle" TargetType="Label">
            <Setter Property="FontSize" Value="{Binding Converter={StaticResource SizeToRelativeSizeConverter}, ConverterParameter={StaticResource fontSizeFactor}}" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

0.03
并将样式设置为相关标签(或其他元素):

<Label Text="Welcome to Xamarin.Forms!" Style="{StaticResource LabelStyle}"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />

如果要根据平台更改UI的值,可以使用“on platform”语句。 例如,如果您希望iOS上的网格与Android上的网格具有不同的余量,您可以这样使用:

<Grid>
    <Grid.Margin>
        <On Platform x:TypeArguments="Thickness">
            <On Platform="iOS">0,0,0,0</On>
            <On Platform="Android">15,0,15,0</On>
        </OnPlatform>
    </Grid.Margin>
</Grid>
在android实现中,添加界面的实现:

获取屏幕尺寸-Android

ScreenDimensions.cs

获取屏幕尺寸-iOS

ScreenDimensions.cs

构建值转换器以使用屏幕尺寸

        switch (Device.RuntimePlatform)
        {
            case Device.iOS:
                //MainPage.BackgroundColor = Color.Black;
                break;
            case Device.Android:
                //MainPage.BackgroundColor = Color.Red;
                break;
            case Device.UWP:
                //MainPage.BackgroundColor = Color.Orange;
                break;
            default:
                //MainPage.BackgroundColor = Color.Transparent;
                break;
        }
现在我们创建一个IValueConverter(同样在共享代码中):

screensizetorelativesesizeconverter.cs

公共类ScreenSizeToRelativeSeizeConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
double height=DependencyService.Get().GetScreenHeight();
返回(双)高*(双)参数;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
//不需要将任何东西转换回来
抛出新的NotImplementedException();
}
}
请注意,转换器需要一个参数来告诉它最终得到的屏幕大小的哪一部分

将所有内容放在一起

最后,将以下资源添加到App.xaml文件中:

<Application.Resources>
    <ResourceDictionary>
        <converter:ScreenSizeToRelativeSizeConverter x:Key="SizeToRelativeSizeConverter"/>
        <x:Double x:Key="fontSizeFactor">0.03</x:Double>
        <Style x:Key="LabelStyle" TargetType="Label">
            <Setter Property="FontSize" Value="{Binding Converter={StaticResource SizeToRelativeSizeConverter}, ConverterParameter={StaticResource fontSizeFactor}}" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

0.03
并将样式设置为相关标签(或其他元素):

<Label Text="Welcome to Xamarin.Forms!" Style="{StaticResource LabelStyle}"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />


我以为平台上的应用程序已被弃用?这只是平台上的代码,而不是平台上的xaml端吗?无论如何,我会尝试你在这里,我会让你知道结果是什么。谢谢。是的,平台有点失礼。平台上(注意空间)是替换。别问我为什么,我也不明白。这最终回答了我的问题。非常感谢。我学到了很多二传手的力量。我需要提出一个更好的问题,而不是一个可能的解决方案。我想我可能没有正确地考虑这个问题,可能有一个答案,我离森林太近了,看不到他们所说的树木。我以为平台上的东西被弃用了?这只是平台上的代码,而不是平台上的xaml端吗?无论如何,我会尝试你在这里,我会让你知道结果是什么。谢谢。是的,平台有点失礼。平台上(注意空间)是替换。别问我为什么,我也不明白。这最终回答了我的问题。非常感谢。我学到了很多二传手的力量。我需要提出一个更好的问题,而不是一个可能的解决方案。我想我可能没有正确地思考这个问题,可能有一个答案,我离森林太近,看不到他们所说的树木。
<Label Text="Welcome to Xamarin.Forms!" Style="{StaticResource LabelStyle}"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />