第二十四章:页面导航(十二)

简介: 事件在方法调用方法和消息中心通信方法中,信息页面需要知道主页的类型。 如果可以从不同类型的页面调用相同的信息页面,这有时是不合需要的。这个问题的一个解决方案是info类实现一个事件,这就是DataTransfer3中采用的方法。

事件
在方法调用方法和消息中心通信方法中,信息页面需要知道主页的类型。 如果可以从不同类型的页面调用相同的信息页面,这有时是不合需要的。
这个问题的一个解决方案是info类实现一个事件,这就是DataTransfer3中采用的方法。 Information类和XAML文件与以前的程序相同,但DataTransfer3InfoPage现在实现名为InformationReady的公共事件:

public partial class DataTransfer3InfoPage : ContentPage
{
    // Define a public event for transferring data.
    public EventHandler<Information> InformationReady;
    // Instantiate an Information object for this page instance.
    Information info = new Information();
    public DataTransfer3InfoPage()
    {
        InitializeComponent();
    }
    public void InitializeInfo(Information info)
    {
        // Replace the instance.
        this.info = info;
        // Initialize the views.
        nameEntry.Text = info.Name ?? "";
        emailEntry.Text = info.Email ?? ""; 
        if (!String.IsNullOrWhiteSpace(info.Language))
        {
            languagePicker.SelectedIndex = languagePicker.Items.IndexOf(info.Language);
        }
        datePicker.Date = info.Date;
    }
    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        // Set properties of Information object.
        info.Name = nameEntry.Text;
        info.Email = emailEntry.Text;
        int index = languagePicker.SelectedIndex;
        info.Language = index == -1 ? null : languagePicker.Items[index];
        info.Date = datePicker.Date;
        // Raise the InformationReady event.
        EventHandler<Information> handler = InformationReady;
        if (handler != null)
            handler(this, info);
    }
}

在OnDisappearing覆盖期间,该类从元素设置信息属性,并使用Information对象引发InformationReady事件。
主页可以在实例化信息页面之后或在导航到页面之后为InformationReady事件设置处理程序。 事件处理程序将Information对象添加到ListView或替换现有项:

public partial class DataTransfer3HomePage : ContentPage
{
    ObservableCollection<Information> list = new ObservableCollection<Information>();
    public DataTransfer3HomePage()
    {
        InitializeComponent();
        // Set collection to ListView.
        listView.ItemsSource = list;
    }
    // Button Clicked handler.
    async void OnGetInfoButtonClicked(object sender, EventArgs args)
    {
        DataTransfer3InfoPage infoPage = new DataTransfer3InfoPage();
        await Navigation.PushAsync(infoPage);
        // Set event handler for obtaining information.
         infoPage.InformationReady += OnInfoPageInformationReady;
    }
    // ListView ItemSelected handler.
    async void OnListViewItemSelected(object sender, SelectedItemChangedEventArgs args)
    {
        if (args.SelectedItem != null)
        {
            // Deselect the item.
            listView.SelectedItem = null;
            DataTransfer3InfoPage infoPage = new DataTransfer3InfoPage();
            await Navigation.PushAsync(infoPage);
            infoPage.InitializeInfo((Information)args.SelectedItem);
            // Set event handler for obtaining information.
            infoPage.InformationReady += OnInfoPageInformationReady;
        }
    }
    void OnInfoPageInformationReady(object sender, Information info)
    {
        // If the object has already been added, replace it.
        int index = list.IndexOf(info);
        if (index != -1)
        {
            list[index] = info;
        }
        // Otherwise, add it.
        else
        {
            list.Add(info);
        }
    }
}

这种方法存在一些问题。 第一个问题是没有方便的地方来分离事件处理程序。 信息页面在其OnDisappearing覆盖中引发事件。 如果您不确定仅在导航发生时调用OnDisappearing,则主页无法在处理程序本身中分离事件处理程序。
主页也不能在其OnAppearing覆盖中分离事件处理程序,因为当信息页面返回到主页时,调用OnAppearing和OnDisappearing覆盖的顺序取决于平台。
如果主页无法从信息页面中分离处理程序,则每个信息页面实例将继续维护对主页的引用,并且不能进行垃圾回收。
当应用程序需要保存和恢复页面状态时,事件处理程序方法也不好。 当程序再次执行时,信息页面无法保存事件的状态以恢复它。

目录
相关文章
|
6月前
|
小程序
【微信小程序】-- 页面导航 -- 编程式导航(二十三)
【微信小程序】-- 页面导航 -- 编程式导航(二十三)
|
4月前
|
前端开发
网页设计04 WEB端按钮设计技巧,交互规范参考资料,点击事件,什么是3:1 ,3:1 的介绍,网页设计牵扯的知识整理成口诀
网页设计04 WEB端按钮设计技巧,交互规范参考资料,点击事件,什么是3:1 ,3:1 的介绍,网页设计牵扯的知识整理成口诀
|
前端开发
#私藏项目实操分享# 【练习案例React十】封装一个锚点tab栏
#私藏项目实操分享# 【练习案例React十】封装一个锚点tab栏
115 0
#私藏项目实操分享# 【练习案例React十】封装一个锚点tab栏
|
前端开发
#私藏项目实操分享# 【练习案例React九】封装一个标题显示栏
#私藏项目实操分享# 【练习案例React九】封装一个标题显示栏
145 0
#私藏项目实操分享# 【练习案例React九】封装一个标题显示栏
|
Android开发 索引 iOS开发
第二十四章:页面导航(十七)
像现实生活中的应用程序理想情况下,用户在终止并重新启动应用程序时不应该知道。应用程序体验应该是连续且无缝的。即使程序没有一直运行,一个半月进入的条目从未完成也应该在一周后处于相同的状态。NoteTaker程序允许用户记录由标题和一些文本组成的注释。
543 0
|
XML JSON Android开发
第二十四章:页面导航(十五)
保存和恢复页面状态特别是当您开始使用多页面应用程序时,将应用程序的页面视为数据的主要存储库非常有用,而仅仅是作为底层数据的临时可视化和交互式视图。这里的关键词是暂时的。如果您在用户与之交互时保持基础数据是最新的,那么页面可以显示和消失而不必担心。
651 0
|
JavaScript 前端开发 Android开发
第二十四章:页面导航(十六)
保存和恢复导航堆栈 许多多页面应用程序的页面体系结构比DataTransfer6更复杂,您需要一种通用的方法来保存和恢复整个导航堆栈。此外,您可能希望将导航堆栈的保存与系统方式集成,以保存和恢复每个页面的状态,特别是如果您不使用MVVM。
493 0
|
JavaScript Android开发
第二十四章:页面导航(十四)
切换到ViewModel此时应该很明显,Information类应该真正实现INotifyPropertyChanged。 在DataTransfer5中,Information类已成为InformationViewModel类。
603 0
|
Android开发 索引
第二十四章:页面导航(十一)
消息中心您可能不喜欢两个页面类直接相互调用方法的想法。 它似乎适用于小样本,但对于具有大量类间通信的大型程序,您可能更喜欢一些不需要实际页面实例的更灵活的东西。这样的工具是Xamarin.Forms MessagingCenter类。
554 0
|
JavaScript Android开发 索引
第二十四章:页面导航(十三)
App类中介在Xamarin.Forms应用程序中,在公共代码项目中执行的第一个代码是通常名为App的类的构造函数,该类派生自Application。 在程序终止之前,此App对象保持不变,并且程序中的任何代码都可以通过静态Application.Current属性使用它。
509 0