Xamarin 如何使ActivityIndicator覆盖全屏?

Xamarin 如何使ActivityIndicator覆盖全屏?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我有一个堆栈布局,里面有许多元素(按钮、文本等)。 我希望活动指示器覆盖整个屏幕,使其无法对这些元素执行任何操作。 我已经将ActivityIndicator放在StackLayout中,但用AbsoluteLayout包装它,认为AbsoluteLayout可以轻松地重叠所有内容: <StackLayout> <AbsoluteLayout> <ActivityIndicator ... /> </AbsoluteLay

我有一个堆栈布局,里面有许多元素(按钮、文本等)。
我希望活动指示器覆盖整个屏幕,使其无法对这些元素执行任何操作。
我已经将ActivityIndicator
放在StackLayout中,但用AbsoluteLayout包装它,认为AbsoluteLayout可以轻松地重叠所有内容:

<StackLayout>
    <AbsoluteLayout>
        <ActivityIndicator ... />
    </AbsoluteLayout>
    <...other elements...> 
</StackLayout>

相反,活动指示器显示在StackLayout的顶部,其他元素可用于影响。我是Xamarin和布局的新手,我做错了什么?Internet中的所有示例每页都有一个ActivityIndicator…

如果要“重叠”,则需要在StackLayout之外。网格是这方面最常见的控件:

<Grid>
  <StackLayout>
        <...other elements...> 
  </StackLayout>
  <ActivityIndicator ... />
</Grid>

最好说,
绝对布局
的子级可以很容易地相互重叠。正如
StackLayout
允许您在内部垂直或水平堆叠控件一样,
AbsoluteLayout
允许您使用绝对值或比例值在内部定位控件,因此如果两个控件具有相同的绝对定位集,它们将100%重叠

因此,您希望使用比例大小将您的
堆栈布局
和另一个
堆栈布局
封装在
绝对布局
中,例如:

<AbsoluteLayout>
    <StackLayout
        x:Name="mainLayout"
        AbsoluteLayout.LayoutBounds="0,0,1,1"
                 AbsoluteLayout.LayoutFlags="All" >
        <Label Text="Welcome to Xamarin.Forms!"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand" />
        <Button Text="Do Something"
                Clicked="DoSomethingBtn_Clicked" />
    </StackLayout>
    <StackLayout
        x:Name="aiLayout"
        IsVisible="False"
        AbsoluteLayout.LayoutBounds="0,0,1,1"
        AbsoluteLayout.LayoutFlags="All"
        BackgroundColor="Gray" Opacity="0.5">
        <ActivityIndicator
            x:Name="ai"
            IsRunning="False"
            HorizontalOptions="CenterAndExpand"
            VerticalOptions="CenterAndExpand"
            Color="Black"/>
    </StackLayout>

</AbsoluteLayout>
下面是它的外观:

由于第二个
StackLayout
完全覆盖了第一个
StackLayout
中的所有控件都不可单击

可能值得查看AbsoluteLayout的文档,以了解AbsoluteLayout.LayoutBounds和AbsoluteLayout.LayoutFlags:

这里有一个被黑客攻击的控件,它可以通过名为
的RelativeLayout(仅在Android上测试)让东西全屏显示

它可以这样使用:

<controls:FullScreenLayout>
  <!-- Anything you want fullscreen here -->
</controls:FullScreenLayout>


不幸的是,如果您使用
导航页面
这将不会与导航栏重叠。此页面上当前的所有其他解决方案都有相同的问题。据介绍,如果不使用特定于平台的客户渲染器,就不可能解决这个问题。啊

如果您不介意页面变暗,可以使用实现所需自定义呈现器的



我最终解决了类似的问题(大部分屏幕变暗),为导航页面本身实现了一个自定义渲染器。

感谢您提供的详细答案!您能告诉我是否可以在多个页面上动态创建和显示ActivityIndicator吗?我有几十个页面,其中大多数需要进行web请求,因此我需要显示此指示器。我应该把指示器放在每个页面中,还是最好有一个带有指示器的ContentView,我会将其显示为模式对话框?再次感谢!您可以创建一个ContentView,然后将该ContentView添加到每个页面。或者你可以制作一个内容页面,并以模式呈现。关于如何处理这个问题,有太多的选择,所以你最终要做什么取决于你。如果你想让指示器变大,这是一个救生圈。只需使用刻度属性这是错误的。您可以使用
RelativeLayout
超出控件的边界。在这里,他指的是堆栈布局和绝对布局。我的答案没有错。。。RelativeLayout也可以进行重叠。但如果你不知道,这种布局或多或少是不推荐的。请参阅(来自前XF团队的Jason Smith)。CordiallyI的意思是,除非
网格
是整个应用程序的根元素,否则这将不起作用,而这并不总是可能的(例如,如果应用程序使用
导航页面
),网格将永远不会是整个应用程序的根元素。它必须是从页面继承的内容(TabbePage、NavigationPage、Shell等等)。我给出一个答案。你说这是错误的,你总是会争论越来越多的论点(顺便说一句,这是不合法的),但我在这个答案中写的一切都是正确的+我提供的链接是来自创建XF的人。这不是谁是最好的问题,我不在乎,但请。。。这是我最后一条来自MS的信息:=>“尽可能避免使用RelativeLayout。这将导致CPU必须执行更多的工作。”@RudySpano我们正在布置一个孩子,因此这与这里无关。而且它似乎甚至不可能与其他布局类型实现这一点,因此性能比较是没有意义的。。。也许你是唯一真正理解这个请求的人。。。?(与所有其他投票和诉讼相比)。我可以向您保证,如果您使用的是FullScreenLayout,那么您可以通过开箱即用的布局和控件实现相同的behvior。不管怎样,好吧,那是你的选择。(+thred是1年的)+@RudySpano:回答老问题不仅是允许的,而且是积极鼓励的。重点不是帮助最初的询问者,而是帮助未来的谷歌解决同样的问题。
    [ContentProperty("ContentInner")]
    public class FullScreenLayout : ContentView
    {
        public View ContentInner
        {
            get => ((RelativeLayout) Content).Children[0];
            set
            {
                var display = DeviceDisplay.MainDisplayInfo;
                var screenWidth = display.Width / display.Density;
                var screenHeight = display.Height / display.Density;
                var wrapper = new RelativeLayout();
                wrapper.Children.Add(value, () => new Rectangle(0, 0, screenWidth, screenHeight));
                Content = wrapper;
            }
        }
    }
<controls:FullScreenLayout>
  <!-- Anything you want fullscreen here -->
</controls:FullScreenLayout>