背水一战 Windows 10 (41) - 控件(导航类): Frame

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背水一战 Windows 10 (41) - 控件(导航类): Frame相关的知识,希望对你有一定的参考价值。

原文:背水一战 Windows 10 (41) - 控件(导航类): Frame

[源码下载]


背水一战 Windows 10 (41) - 控件(导航类): Frame



作者:webabcd


介绍
背水一战 Windows 10 之 控件(导航类)

  • Frame



示例
Controls/NavigationControl/FrameDemo.xaml

<Page
    x:Class="Windows10.Controls.NavigationControl.FrameDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.NavigationControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10" Orientation="Horizontal">

            <StackPanel Width="400">
                <Button Name="btnGotoFrame1" Content="导航至 Frame1" Click="btnGotoFrame1_Click" />

                <Button Name="btnGotoFrame2" Content="导航至 Frame2" Click="btnGotoFrame2_Click" Margin="0 10 0 0" />

                <Button Name="btnBack" Content="后退" Click="btnBack_Click" Margin="0 10 0 0" />

                <Button Name="btnForward" Content="前进" Click="btnForward_Click" Margin="0 10 0 0" />

                <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="0 10 0 0" />
            </StackPanel>

            <Frame Name="frame" VerticalAlignment="Top" Margin="10 0 0 0"  />

        </StackPanel>
    </Grid>
</Page>

Controls/NavigationControl/FrameDemo.xaml.cs

/*
 * Frame - 框架控件,用于导航内容(继承自 ContentControl, 请参见 /Controls/BaseControl/ContentControlDemo/)
 *     BackStackDepth - 返回 stack 中的条目数
 *     BackStack - 返回向后导航历史记录的 PageStackEntry 实例的集合(可以根据需求对集合增删改查)
 *     ForwardStack - 返回向前导航历史记录的 PageStackEntry 实例的集合(可以根据需求对集合增删改查)
 *     CanGoBack - 可否可以向后导航
 *     CanGoForward - 可否可以向前导航
 *     GoBack() - 向后导航,可以指定过渡效果
 *     GoForward() - 向前导航
 *     Navigate() - 导航到指定的 Type,可以传递一个 object 类型的参数,可以指定过渡效果
 *     CurrentSourcePageType - 获取 Frame 当前内容的 Type
 *     SourcePageType - 获取或设置 Frame 当前内容的 Type
 * 
 *     CacheSize - 所支持的最大缓存页数,默认值 10
 *         CacheSize 与被导航的页的 Page.NavigationCacheMode 属性相关(详见 Frame1.xaml.cs 和 Frame2.xaml.cs 的示例代码)
 *             NavigationCacheMode.Disabled - 每次导航到页时,都重新实例化此页,默认值(CacheSize 无效)
 *             NavigationCacheMode.Enabled - 每次导航到页时,首先缓存此页,此时如果已缓存的页数大于 CacheSize,则按先进先出的原则丢弃最早的缓存页(CacheSize 有效)
 *             NavigationCacheMode.Required - 每次导航到页时,都缓存此页(CacheSize 无效)
 * 
 *     Navigating - 导航开始时触发的事件
 *     Navigated - 导航完成后触发的事件
 *     NavigationFailed - 导航失败时触发的事件
 *     NavigationStopped - 导航过程中,又请求了一个新的导航时触发的事件
 *     
 *     GetNavigationState() - 获取 Frame 当前的导航状态,返回字符串类型的数据,仅当导航无参数传递或只传递简单参数(int, char, string, guid, bool 等)时有效
 *     SetNavigationState(string navigationState) - 将 Frame 还原到指定的导航状态
 *     
 *     
 * PageStackEntry - 保存在 stack 中的页对象
 *      SourcePageType - 获取此页的类型
 *      Parameter - 获取之前导航至此页时的参数
 *
 * 
 * NavigationEventArgs - 导航的事件参数
 *     NavigationMode - 导航方式,只读(Windows.UI.Xaml.Navigation.NavigationMode 枚举)
 *         New, Back, Forward, Refresh
 *     Parameter - 传递给导航目标页的参数,只读
 *     SourcePageType - 导航的目标页的类型,只读
 *     
 *     
 * 注:
 * 1、关于导航过程中的过渡效果请参见 /Animation/ThemeTransition/NavigationTransitionInfo/ 中的内容
 * 2、Frame 中与过渡效果有关的是 GoBack() 和 Navigate() 中的 NavigationTransitionInfo 类型的参数
 */

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace Windows10.Controls.NavigationControl
{
    public sealed partial class FrameDemo : Page
    {
        public FrameDemo()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            frame.Navigated += frame_Navigated;
        }

        void frame_Navigated(object sender, NavigationEventArgs e)
        {
            lblMsg.Text = "CacheSize: " + frame.CacheSize;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "BackStackDepth: " + frame.BackStackDepth;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "CanGoBack: " + frame.CanGoBack;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "CanGoForward: " + frame.CanGoForward;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "CurrentSourcePageType: " + frame.CurrentSourcePageType;
            lblMsg.Text += Environment.NewLine;

            // 显示 frame 的当前的导航状态,记录此值后,可以在需要的时候通过 SetNavigationState() 将 frame 还原到指定的导航状态
            lblMsg.Text += "NavigationState: " + frame.GetNavigationState();
        }

        private void btnGotoFrame1_Click(object sender, RoutedEventArgs e)
        {
            frame.Navigate(typeof(Frame1), "param1");
        }

        private void btnGotoFrame2_Click(object sender, RoutedEventArgs e)
        {
            frame.SourcePageType = typeof(Frame2);
        }

        private void btnBack_Click(object sender, RoutedEventArgs e)
        {
            if (frame.CanGoBack)
                frame.GoBack();
        }

        private void btnForward_Click(object sender, RoutedEventArgs e)
        {
            if (frame.CanGoForward)
                frame.GoForward();
        }
    }
}


Controls/NavigationControl/Frame1.xaml

<Page
    x:Class="Windows10.Controls.NavigationControl.Frame1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.NavigationControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <TextBlock Name="lblMsg" Margin="5" TextWrapping="Wrap" />

        </StackPanel>
    </Grid>
</Page>

Controls/NavigationControl/Frame1.xaml.cs

using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace Windows10.Controls.NavigationControl
{
    public sealed partial class Frame1 : Page
    {
        public Frame1()
        {
            this.InitializeComponent();

            /*
             * Page.NavigationCacheMode - 使用 Frame 导航到此页面时,页面的缓存模式
             *     Disabled - 每次导航到页时,都重新实例化此页,默认值(Frame.CacheSize 无效)
             *     Enabled - 每次导航到页时,首先缓存此页,此时如果已缓存的页数大于 Frame.CacheSize,则按先进先出的原则丢弃最早的缓存页(Frame.CacheSize 有效)
             *     Required - 每次导航到页时,都缓存此页(Frame.CacheSize 无效)
             */
            this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;

            this.Loaded += Frame1_Loaded;
        }

        void Frame1_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "Loaded: " + DateTime.Now.ToString();
        }

        // 来了
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "OnNavigatedTo: " + DateTime.Now.ToString();
            lblMsg.Text += " param: " + (string)e.Parameter;
        }

        // 准备走了,但是可以取消
        protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "OnNavigatingFrom(NavigatingCancelEventArgs): " + DateTime.Now.ToString();
            lblMsg.Text += " param: " + (string)e.Parameter;
        }

        // 已经走了
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "OnNavigatedFrom(NavigationEventArgs): " + DateTime.Now.ToString();
            lblMsg.Text += " param: " + (string)e.Parameter;
        }
    }
}


Controls/NavigationControl/Frame2.xaml

<Page
    x:Class="Windows10.Controls.NavigationControl.Frame2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.NavigationControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <TextBlock Name="lblMsg" Margin="5" TextWrapping="Wrap" />

        </StackPanel>
    </Grid>
</Page>

Controls/NavigationControl/Frame2.xaml.cs

using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace Windows10.Controls.NavigationControl
{
    public sealed partial class Frame2 : Page
    {
        public Frame2()
        {
            this.InitializeComponent();

            /*
             * Page.NavigationCacheMode - 使用 Frame 导航到此页面时,页面的缓存模式
             *     Disabled - 每次导航到页时,都重新实例化此页,默认值(Frame.CacheSize 无效)
             *     Enabled - 每次导航到页时,首先缓存此页,此时如果已缓存的页数大于 Frame.CacheSize,则按先进先出的原则丢弃最早的缓存页(Frame.CacheSize 有效)
             *     Required - 每次导航到页时,都缓存此页(Frame.CacheSize 无效)
             */
            this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;

            this.Loaded += Frame2_Loaded;
        }

        void Frame2_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "Loaded: " + DateTime.Now.ToString();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "OnNavigatedTo: " + DateTime.Now.ToString();
        }
    }
}



OK
[源码下载]

以上是关于背水一战 Windows 10 (41) - 控件(导航类): Frame的主要内容,如果未能解决你的问题,请参考以下文章

背水一战 Windows 10 (42) - 控件(导航类): Frame 动画

背水一战 Windows 10 (30) - 控件(文本类): AutoSuggestBox

背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation

背水一战 Windows 10 (27) - 控件(文本类): TextBlock

背水一战 Windows 10 (37) - 控件(弹出类): MessageDialog, ContentDialog

背水一战 Windows 10 (54) - 控件(集合类): ItemsControl 的布局控件 - OrientedVirtualizingPanel, VirtualizingStackPan