C# Xamarin页面完全加载时发生的事件?
社区 事先,如果这真的有一个简单的解决方案,我道歉。考虑到我在Xamarin方面的技术水平,我有一个棘手的问题需要解决 问题在于,当页面完全显示时,Xamarin似乎没有可调用的事件/函数/etc,因为您可以看到页面应该显示的所有内容,然后调用该函数。请注意,对我不起作用的是OnAppearing函数,因为它在屏幕可见之前就过早启动了 我试图破译一个解决方案。在本文中,用户使用以下代码进行回答 以下是步骤1): 步骤2) 步骤3) 首要关注点。我创建了一个ViewModel文件,它位于一个名为“ViewModels”的文件夹中,在链接中发布代码的用户说要在视图模型中创建一个属性,出于某种原因,我收到一个错误,声明“名称集属性在当前上下文中不存在”。那么,我可以交换掉代码,只放下面的代码吗?我的意思是看起来是一样的,对吧C# Xamarin页面完全加载时发生的事件?,c#,android,ios,windows,xamarin,C#,Android,Ios,Windows,Xamarin,社区 事先,如果这真的有一个简单的解决方案,我道歉。考虑到我在Xamarin方面的技术水平,我有一个棘手的问题需要解决 问题在于,当页面完全显示时,Xamarin似乎没有可调用的事件/函数/etc,因为您可以看到页面应该显示的所有内容,然后调用该函数。请注意,对我不起作用的是OnAppearing函数,因为它在屏幕可见之前就过早启动了 我试图破译一个解决方案。在本文中,用户使用以下代码进行回答 以下是步骤1): 步骤2) 步骤3) 首要关注点。我创建了一个ViewModel文件,它位于一个名为“
public bool Temp
{
get { return _toggleTemp; }
set { _toggleTemp = value; }
}
第二个问题。我不知道他的代码中“LoadingVm”是什么。这对我来说不合适。是不是因为我在顶部漏了一个“使用”字?但无论如何,整个代码行都是“LoadingVm.ToggleTemp=true;”,所以他只是调用函数将其设置为true
最后,我想这无疑会帮助我在页面完全加载后,在我可以做任何我想做的事情的地方运行代码,对吗?我真的没有看到太多人不同意链接中那个家伙给出的方法,但如果是这样,请随意给出其他建议
再次,如果这是一个简单的错误,请原谅我。我仍然习惯于Xamarin,而C#在我的脑海中仍然有些新鲜,因为我已经有一段时间没有使用它了。您可以使用ContentPage的自定义呈现程序来了解视图是否已完全加载,然后使用它来通知您的共享项目:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
Console.WriteLine("OnAppearing");
MessagingCenter.Subscribe<object>(new object(), "ViewLoaded", (sender) =>
{
// Do something whenever the "ViewLoaded" message is received
Console.WriteLine("Do something whenever the ViewLoaded message is received");
});
}
}
在iOS中:
[assembly:ExportRenderer (typeof(ContentPage), typeof(CameraPageRenderer))]
namespace App362.iOS
{
public class CameraPageRenderer : PageRenderer
{
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
Console.WriteLine("ViewDidAppear");
MessagingCenter.Send<object>(new object(), "ViewLoaded");
}
}
}
[程序集:导出呈现程序(typeof(ContentPage)、typeof(CameraPageRenderer))]
名称空间App362.iOS
{
公共类CameraPageRenderer:页面渲染器
{
公共覆盖无效视图显示(布尔动画)
{
基本视图显示(动画);
Console.WriteLine(“视图显示”);
Send(新对象(),“ViewLoaded”);
}
}
}
在Android中:
[assembly: ExportRenderer(typeof(ContentPage), typeof(CameraPageRenderer))]
namespace App362.Droid
{
[Obsolete]
public class CameraPageRenderer : PageRenderer{
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
Console.WriteLine("OnAttachedToWindow");
MessagingCenter.Send<object>(new object(), "ViewLoaded");
}
}
}
[程序集:导出呈现程序(typeof(ContentPage)、typeof(CameraPageRenderer))]
名称空间App362.Droid
{
[过时]
公共类CameraPageRenderer:页面渲染器{
受保护的覆盖无效OnAttachedToWindow()
{
base.OnAttachedToWindow();
Console.WriteLine(“OnAttachedToWindow”);
Send(新对象(),“ViewLoaded”);
}
}
}
在共享项目中:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
Console.WriteLine("OnAppearing");
MessagingCenter.Subscribe<object>(new object(), "ViewLoaded", (sender) =>
{
// Do something whenever the "ViewLoaded" message is received
Console.WriteLine("Do something whenever the ViewLoaded message is received");
});
}
}
public分部类主页面:ContentPage
{
公共主页()
{
初始化组件();
}
出现时受保护的覆盖无效()
{
base.OnAppearing();
控制台。写线(“OnAppearing”);
MessagingCenter.Subscribe(新对象(),“ViewLoaded”,(发件人)=>
{
//每当收到“ViewLoaded”消息时,请执行某些操作
WriteLine(“在收到ViewLoaded消息时执行操作”);
});
}
}
您可以使用ContentPage的自定义呈现程序来了解视图是否已完全加载,然后使用来通知您的共享项目:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
Console.WriteLine("OnAppearing");
MessagingCenter.Subscribe<object>(new object(), "ViewLoaded", (sender) =>
{
// Do something whenever the "ViewLoaded" message is received
Console.WriteLine("Do something whenever the ViewLoaded message is received");
});
}
}
在iOS中:
[assembly:ExportRenderer (typeof(ContentPage), typeof(CameraPageRenderer))]
namespace App362.iOS
{
public class CameraPageRenderer : PageRenderer
{
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
Console.WriteLine("ViewDidAppear");
MessagingCenter.Send<object>(new object(), "ViewLoaded");
}
}
}
[程序集:导出呈现程序(typeof(ContentPage)、typeof(CameraPageRenderer))]
名称空间App362.iOS
{
公共类CameraPageRenderer:页面渲染器
{
公共覆盖无效视图显示(布尔动画)
{
基本视图显示(动画);
Console.WriteLine(“视图显示”);
Send(新对象(),“ViewLoaded”);
}
}
}
在Android中:
[assembly: ExportRenderer(typeof(ContentPage), typeof(CameraPageRenderer))]
namespace App362.Droid
{
[Obsolete]
public class CameraPageRenderer : PageRenderer{
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
Console.WriteLine("OnAttachedToWindow");
MessagingCenter.Send<object>(new object(), "ViewLoaded");
}
}
}
[程序集:导出呈现程序(typeof(ContentPage)、typeof(CameraPageRenderer))]
名称空间App362.Droid
{
[过时]
公共类CameraPageRenderer:页面渲染器{
受保护的覆盖无效OnAttachedToWindow()
{
base.OnAttachedToWindow();
Console.WriteLine(“OnAttachedToWindow”);
Send(新对象(),“ViewLoaded”);
}
}
}
在共享项目中:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
Console.WriteLine("OnAppearing");
MessagingCenter.Subscribe<object>(new object(), "ViewLoaded", (sender) =>
{
// Do something whenever the "ViewLoaded" message is received
Console.WriteLine("Do something whenever the ViewLoaded message is received");
});
}
}
public分部类主页面:ContentPage
{
公共主页()
{
初始化组件();
}
出现时受保护的覆盖无效()
{
base.OnAppearing();
控制台。写线(“OnAppearing”);
MessagingCenter.Subscribe(新对象(),“ViewLoaded”,(发件人)=>
{
//每当收到“ViewLoaded”消息时,请执行某些操作
WriteLine(“在收到ViewLoaded消息时执行操作”);
});
}
}
1)这不一样,您没有使用INotifyPropertyChanged,2)LoadingVM只是他的VM类别的名称1)我相信我以前尝试过将某种形式的“NotifyPropertyChanged”作为基类。但不知什么原因,我一定把事情搞砸了。我将尝试搜索需要包含的内容以访问它。2) 哦,可以理解。即使你把它包括在基类中,你仍然需要在你的属性集合中调用这个方法。我当然明白了。如果我以前不清楚的话,我只需要适当地包括它。上次我试的时候出现了几条红线。因此,我将再次尝试,并确保我将其称为属性设置器。我的解决方案对您有效吗?如果是,请您接受(单击☑️ 在这个答案的左上角)这样我们就可以帮助更多的人解决同样的问题:)。1)这不一样,你没有使用INotifyPropertyChanged,2)LoadingVM只是他的VM类别的名称1)我相信我尝试过包含某种形式的“Notif”