【发布时间】:2019-04-02 15:18:26
【问题描述】:
我试图在我的配置下载后隐藏名为InfoStackLayout 的StackLayout,显示信息标签为5s,
但是在代码中隐藏Infostack 后,我在ContentPage 中的Grid 不会刷新视图并留下空白空间。 (InfoStackLayout 不可见但仍保留空间)
更糟糕的是,ButtonsStack 中的按钮无法正确响应点击事件。
锁定和解锁手机后,一切正常。
<Grid x:Name="RootGrid" VerticalOptions="Fill" RowSpacing="0" ColumnSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackLayout x:Name="InfoStackLayout" Grid.Row="0" Orientation="Horizontal">
<Label x:Name="InfoLabel" TextColor="White" HorizontalOptions="StartAndExpand" Font="18" />
<Image x:Name="GetConfig" HorizontalOptions="EndAndExpand" Source="loading.png" HeightRequest="32" WidthRequest="32">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="ReloadConfig_Tapped" NumberOfTapsRequired="1"/>
</Image.GestureRecognizers>
</Image>
</StackLayout>
<StackLayout x:Name="ButtonsStack" Grid.Row="1">
</StackLayout>
</Grid>
InfoLabel.Text = "Download Config";
Device.StartTimer(TimeSpan.FromSeconds(5), () =>
{
Task.Factory.StartNew(async () =>
{
await InfoStackLayout.FadeTo(0);
InfoStackLayout.IsVisible = false;
InfoStackLayout.HeightRequest = 0;
});
return false;
});
【问题讨论】:
-
使用 YourViewOrLayout.ForceLayout();当你显示/隐藏时。
-
对 UI 的任何更新都必须在主线程上完成。将隐藏逻辑封装在 InvokeOnMainThread 方法中。
-
@Shan 谢谢!用 Device.BeginInvokeOnMainThread 替换 Task.Factory.StartNew 完成了工作:)
标签: c# xaml xamarin.forms visibility stacklayout