C# 当屏幕缩小时,部分视图神奇地消失了(Android上的Xamarin表单)

C# 当屏幕缩小时,部分视图神奇地消失了(Android上的Xamarin表单),c#,android,xamarin,xamarin.forms,xamarin.android,C#,Android,Xamarin,Xamarin.forms,Xamarin.android,因此,我制作了一个参考SVG文件的界面,其中视图的坐标是从中复制的。 例如,整个SVG图像是250x800,因此我将AbsoluteLayout的宽度和高度设置为相同。各个控件大小也会复制到布局边界,在本例中,每个控件大小为250x200。圆角半径属性、字体大小、边框半径属性也会被复制,但为了简洁起见,此处不显示其用法 如您所见,视图太大。下面的代码将其向后扩展 public主页() { 初始化组件(); 鳞片页(本); } static void ScalePage(ContentPag

因此,我制作了一个参考SVG文件的界面,其中视图的坐标是从中复制的。 例如,整个SVG图像是250x800,因此我将
AbsoluteLayout
的宽度和高度设置为相同。各个控件大小也会复制到布局边界,在本例中,每个控件大小为250x200。圆角半径属性、字体大小、边框半径属性也会被复制,但为了简洁起见,此处不显示其用法


如您所见,视图太大。下面的代码将其向后扩展

public主页()
{
初始化组件();
鳞片页(本);
}
static void ScalePage(ContentPage){
无效比例(对象、事件参数){
var contentMeasure=page.Content.Measure(double.PositiveInfinity、double.PositiveInfinity、MeasureFlags.IncludeMargins);
var contentWidth=contentMeasure.Request.Width;
var contentHeight=contentMeasure.Request.Height;
var contentWidthOnScreen=page.Content.Width;
var contentheight屏幕=page.Content.Height;
var displayInfo=Xamarin.Essentials.DeviceDisplay.MainDisplayInfo;
变量(应用宽度、应用高度)=
Device.RuntimePlatform==Device.UWP?
//遗憾的是,Xamarin.Essentials.DeviceDisplay.MainDisplayInfo返回整个监视器的大小,而不是应用程序窗口的大小
(页宽、页高):
//不幸的是,在Android启动时,page.Width和page.Height都是-1,这是未初始化的值。
(displayInfo.Width/displayInfo.Density、displayInfo.Height/displayInfo.Density);
var scaleW=appWidth/contentWidth;
var scaleH=appHeight/contentHeight;
var scale=Math.Min(scaleW,scaleH);
页面比例=比例;
//将页面移回屏幕
//尺度也适用于翻译
如果(刻度<1){
page.TranslationX=(屏幕上的ContentWidthOn-contentWidth)/2*比例*比例;
page.TranslationY=(屏幕上的内容高度-内容高度)/2*比例*比例;
}
}
页面显示+=比例;
page.SizeChanged+=比例;
}
现在看起来是这样的:

如何使底部的蓝色框整体显示?这似乎是Android特有的问题,因为在UWP上,它看起来是这样的:

引用时,我尝试了一种平台效果,该效果将所有家长和孩子设置为不将孩子剪辑到边界之外:

[汇编:Xamarin.Forms.ResolutionGroupName(“My”)]
[assembly:Xamarin.Forms.ExportEffect(类型为(AndroidSquare.Droid.AndroidVisibleOutOfBoundsChildrenEffect),“效果”)]
名称空间AndroidSquare.Droid
{
类AndroidVisibleOutOfBoundsChildrenEffect:Xamarin.Forms.Platform.Android.PlatformEffect
{
受保护的覆盖无效附加()
{
void NoClip(Android.Views.ViewGroup v)
{
v、 SetClipChildren(假);
v、 setcliptoppadding(false);
}
void NoClipChildren(Android.Views.ViewGroup v)
{
NoClip(v);
对于(变量i=0;i
public主页()
{
初始化组件();
鳞片页(本);
添加(Effect.Resolve(“My.Effect”);
}
效果中设置的断点按预期命中,但是,输出仍与第二个屏幕截图类似。如何使Android版本看起来与UWP相同?我在这个问题上纠缠了好几天

如何使底部的蓝色框整体显示?这似乎是Android特有的问题

如果按代码缩放页面,因为屏幕宽度和高度不变,所以只需缩放绝对布局即可

当我不使用代码进行缩放时,我也看不到整个bule boxview,所以您只需添加Scrollview来显示所有的boxview

<ScrollView>
        <AbsoluteLayout
            HeightRequest="800"
            HorizontalOptions="Center"
            VerticalOptions="Center"
            WidthRequest="250">
            <BoxView AbsoluteLayout.LayoutBounds="0,  0,250,200" Color="Red" />
            <BoxView AbsoluteLayout.LayoutBounds="0,200,250,200" Color="Yellow" />
            <BoxView AbsoluteLayout.LayoutBounds="0,400,250,200" Color="Green" />
            <BoxView AbsoluteLayout.LayoutBounds="0,600,250,200" Color="Blue" />

        </AbsoluteLayout>
    </ScrollView>


为什么你甚至需要自己计算刻度?为什么不将这4个正方形放在一个网格视图中,在该视图中为每行分配25%的高度?这不也是可行的吗,或者你真的想这样做吗?这不适用于角半径、字体大小等。这些都不接受星号值。我在问题的顶部提到了这些值的使用。这需要用户滚动查看所有内容。这看起来很难看。有没有办法在一个屏幕上显示所有内容?@Happypig375,您将绝对布局高度设置为800,但android设备的屏幕高度没有那么大,因此您需要使用Scrollview进行滚动。通过缩放代码,我可以将其缩放到屏幕高度。但是Android会删除屏幕高度以下的视图。UWP没有这个问题。所有内容都可以放入屏幕,如UWP相同代码的结果所示。