当前位置:首页 > Windows程序 > 正文

Windows 10(UWP)开发技巧

2021-03-25 Windows程序

【本系列需要具有一定开发基础】

我们在开发中经常遇到这样的场景:

1.呈现详细信息,且包含一些操作。如:查看原图,支持放大,缩小,多图。

2.执行特定的行为,且要有回执结果。如:选择联系人,选中某图,用户登录。

普遍的解决方案就是封装一个UserControl放到页面里,控制其显隐性。如果功能很少,那无所谓,,可稍微复杂一点的,封装成单独的一个页面不是更好吗?还能节省当前页面的资源。此方法能够解决场景1,但是场景2需要回执结果,又该怎么办,总不能用全局变量吧。PageUserControl就是主要解决这些问题而封装,它将包含特定逻辑的页面封装成伪控件,使其可以单独调用,且可以反馈执行结果。

调用方法如图:

技术分享

PageUserControl

PageUserControl是一个抽象的泛型类,作为封装控件的父类。原理:监听Frame的Navigated事件,利用缓存的两个页面变量,区别出是Forward还是Back,然后分别做传值和取值操作。废话不多说,直接上代码:

public abstract class PageUserControl<TPage> where TPage : Page { private const string _FrameNameInFramePage = "childrenFrame"; private Frame _frame; private object _frameContentWhenOpened; private TPage _page; /// <summary> /// 获取是否优先呈现在ChildrenFrame中。 /// </summary> public bool IsChildrenFrameFirst { get; protected set; } #region Methods protected void ShowPage() { this.OpenPickerPage(); } protected void ShowPage(object parameter) { this.OpenPickerPage(parameter); } //若需向调用者返回某值,则需要实现此方法。 protected virtual void CommitValue(TPage page) { } private void OpenPickerPage(object parameter = null) { if (null == _frame) { _frame = Window.Current.Content as Frame; if (null != _frame) { //这里是约定MainPage页中childrenFrame是子Frame。 //此方法并非绝对,仍有很多灵活的方法可以扩展,比如附加属性来指定谁是ChildrenFrame。 if (this.IsChildrenFrameFirst && this._frame.CurrentSourcePageType.Equals(typeof(Pages.MainPage))) { var framePage = (Pages.MainPage)_frame.Content; var frameInFramePage = framePage.FindName(_FrameNameInFramePage) as Frame; if (frameInFramePage != null) { this._frame = frameInFramePage; } } _frameContentWhenOpened = _frame.Content; _frame.Navigated += OnFrameNavigated; _frame.NavigationStopped += OnFrameNavigationStopped; _frame.NavigationFailed += OnFrameNavigationFailed; if (parameter == null) { _frame.Navigate(typeof(TPage)); } else { _frame.Navigate(typeof(TPage), parameter); } } } } private void ClosePickerPage() { // 注销事件 if (null != _frame) { _frame.Navigated -= OnFrameNavigated; _frame.NavigationStopped -= OnFrameNavigationStopped; _frame.NavigationFailed -= OnFrameNavigationFailed; _frame = null; _frameContentWhenOpened = null; } //若缓存页面有值,则尝试做提交处理。 if (null != this._page) { this.CommitValue(this._page); this._page = null; } } #endregion #region Events private void OnFrameNavigated(object sender, NavigationEventArgs e) { //若是Back则做关闭处理,若是Forward则把新页缓存。 if (e.Content == _frameContentWhenOpened) { ClosePickerPage(); } else if (null == this._page) { var page = e.Content as TPage; if (page != null) { this._page = page; } } } private void OnFrameNavigationFailed(object sender, NavigationFailedEventArgs e) { ClosePickerPage(); } private void OnFrameNavigationStopped(object sender, NavigationEventArgs e) { ClosePickerPage(); } #endregion }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67292.html