为什么点击网格中的按钮会将其移动到 Xamarin Forms 中其他 UI 的前面?

Why does tapping on a Button in a Grid move it in front of other UI in Xamarin Forms?

总结

我想更好地控制 Xamarin.Forms 中按钮上的文本呈现,因此我使用了包含标签和按钮的网格 object。这使我可以更好地控制文本,但它有一个副作用,即单击按钮时标签会移到按钮后面。

为什么会这样? UI 的排序不应该由 children 添加到 Grid 的 Children 的顺序决定吗?

详情

我创建了以下代码来单独测试问题:

// The grid can be added directly to a page
var grid = new Grid();
grid.Margin = new Thickness(100, 100);
grid.WidthRequest = 200;
grid.HeightRequest = 200;

var button = new Button();
button.WidthRequest = 80;
button.HorizontalOptions = LayoutOptions.Start;
button.VerticalOptions = LayoutOptions.Fill;
grid.Children.Add(button);

var label = new Label();
label.Text = "This is some text";
label.VerticalOptions = LayoutOptions.Fill;
label.InputTransparent = true;
grid.Children.Add(label);

调整按钮的大小使其仅与部分文本重叠,以便清楚地看到按钮移动到标签的前面。

在点击按钮之前,布局是这样的:

点击后,按钮移动到标签前面,如下图所示:

我可以让文本有一个点击手势,但是按钮在被触摸时不会播放它的原生效果,所以我想通过点击按钮来保持这个功能。

有没有办法在点击后将标签保留在按钮前面?

编辑

这已经在摩托罗拉 Moto G7 运行 Android 10 和模拟器 运行 Android 版本 9 上进行了测试。

请注意,在 Android 硬件上,标签永久保留在按钮后面。在模拟器上,当按下按钮时,标签移动到按钮后面,但在释放按钮后 re-appears 在顶部。

我做了个demo,问题重现了。由于 fast renderers,会发生此问题。在调用 Forms.Init 之前将代码 'Forms.SetFlags("UseLegacyRenderers");' 添加到您的 MainActivity class。如

 protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Forms.SetFlags("UseLegacyRenderers");
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
    }