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>