在Xamarin Forms for iOS中,我有一个显示视频控件的ContentPage的自定义渲染器。在我的Xamarin Forms应用程序中,此自定义ContentPage显示在NavigationPage中。 当通过MQTT传入特定消息时,我想打开视频屏幕。
当我通过单击主屏幕上的链接打开视频页面时,它会按预期打开。我知道我通过MQTT接收消息并因控制台语句和断点而调用Navigation.PushModalAsync()
。但是,在调用PushModalAsync
后,每次都不会显示自定义呈现的页面,并且我的应用程序的UI会冻结。
基于在我的应用程序后台接收MQTT通知,我还需要做些什么来触发Navigation.PushModalAsync()
吗?
ViewRoomsPage.axml.cs:
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ViewRoomsPage : ContentPage
{
public ViewRoomsPage()
{
InitializeComponent();
}
public string StreamUri { get; set; }
}
ViewRoomsPage.axml:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyForms.Pages.ViewRoomsPage">
<ContentPage.Content>
</ContentPage.Content>
VideoViewerRenderer.cs(删除了视频代码;这应该显示一个空白的红色屏幕。当从主屏幕上的按钮启动时它也有效)
[assembly: ExportRenderer(typeof(ViewRoomsPage), typeof(ViewRoomsRenderer))]
namespace MyForms.IOS.NativeImplementations
{
public class ViewRoomsRenderer : PageRenderer
{
private IJKFFMoviePlayerController _playerController;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
e.NewElement.BackgroundColor = Color.Red;
}
}
}
从接收MQTT消息触发的方法
public void PushViewRooms()
{
Device.BeginInvokeOnMainThread(async () =>
{
await Application.Current.MainPage.Navigation.PushModalAsync(new ViewRoomsPage());
});
}
在App.xaml.cs中:
public partial class App : Application
{
public App()
{
SetupDependencies(); // using StructureMap
Manager = DependencyContainer.Resolve<IMqttManager>();
Manager.Connect();
InitializeComponent();
var mainPage = new MainPage();
MainPage = new NavigationPage(mainPage);
}
}
答案 0 :(得分:0)
问题是由在后台运行的另一部分代码中触发Task.WaitAll()
导致的死锁。
感谢所有帮助理智的人检查它是否与渲染器的设置方式不同。