zoukankan      html  css  js  c++  java
  • 重新想象 Windows 8 Store Apps (37)

    [源码下载]


    重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract



    作者:webabcd


    介绍
    重新想象 Windows 8 Store Apps 之 契约

    • Settings Contract - 右侧边栏称之为 Charm,其中的“设置”称之为 Settings Contract



    示例
    演示 Settings Contract 的应用
    Contracts/SettingsContract/Demo.xaml

    <Page
        x:Class="XamlDemo.Contracts.SettingsContract.Demo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        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="120 0 0 0">
    
                <Button Name="btnAddSettings" Content="注册 SettingsPane 的 CommandsRequested 事件" Click="btnAddSettings_Click_1" />
    
                <Button Name="btnShowSettings" Content="打开 SettingsPane" Click="btnShowSettings_Click_1" Margin="0 10 0 0" />
    
                <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" Margin="0 10 0 0" />
                
            </StackPanel>
        </Grid>
    </Page>

    Contracts/SettingsContract/Demo.xaml.cs

    /*
     * Settings Contract - 右侧边栏称之为 Charm,其中的“设置”称之为 Settings Contract
     * 
     * SettingsPane - 设置面板
     *     GetForCurrentView() - 获取当前的 SettingsPane
     *     Show() - 打开 SettingsPane
     *     CommandsRequested - 每次打开 SettingsPane 时所触发的事件(两个类型为 SettingsPane 和 SettingsPaneCommandsRequestedEventArgs 的参数)
     *     
     * UICommandInvokedHandler - 单击设置面板中的设置项时引发的事件的回调函数,是一个委托(一个类型为 IUICommand 的参数,SettingsCommand 实现了此接口)
     * 
     * SettingsCommand - 设置面板中的设置项
     *     Id - 设置项的 ID,标识用
     *     Label - 设置项的名称,显示用
     *     Invoked - 指定单机设置项后,引发的事件的处理程序
     *     
     * SettingsPaneCommandsRequestedEventArgs - CommandsRequested 事件中的事件参数
     *     Request - 返回 SettingsPaneCommandsRequest 类型的数据
     *     
     * SettingsPaneCommandsRequest - 包含了 CommandsRequested 事件中的可用属性
     *     ApplicationCommands - SettingsCommand 集合
     */
    
    using System;
    using Windows.UI.ApplicationSettings;
    using Windows.UI.Popups;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Media.Animation;
    using Windows.UI.Xaml.Navigation;
    
    namespace XamlDemo.Contracts.SettingsContract
    {
        public sealed partial class Demo : Page
        {
            // 弹出自定义的详细设置页时,所用到的弹出框
            private Popup _settingsPopup = new Popup();
            // 是否注册了 SettingsPane 的 CommandsRequested 事件
            private bool _commandsRequestedRegistered = false;
    
            public Demo()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedFrom(NavigationEventArgs e)
            {
                base.OnNavigatedFrom(e);
    
                // 离开此页则去掉 CommandsRequested 监听
                if (this._commandsRequestedRegistered)
                {
                    SettingsPane.GetForCurrentView().CommandsRequested -= onCommandsRequested;
                    _commandsRequestedRegistered = false;
                }
            }
    
            // 添加设置项,即初始化自定义的设置项
            private void btnAddSettings_Click_1(object sender, RoutedEventArgs e)
            {
                if (!_commandsRequestedRegistered)
                {
                    // 注册 SettingsPane 的 CommandsRequested 事件
                    SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;
                    _commandsRequestedRegistered = true;
                }
                else
                {
                    lblMsg.Text += "已经为 SettingsPane 注册了 CommandsRequested 事件";
                    lblMsg.Text += Environment.NewLine;
                }
            }
    
            // 显示 SettingsPane
            private void btnShowSettings_Click_1(object sender, RoutedEventArgs e)
            {
                SettingsPane.Show();
            }
    
            void onCommandsRequested(SettingsPane settingsPane, SettingsPaneCommandsRequestedEventArgs eventArgs)
            {
                // 初始化 SettingsPane 中的设置项
                UICommandInvokedHandler handler = new UICommandInvokedHandler(onSettingsCommand);
    
                SettingsCommand aboutCommand = new SettingsCommand("about", "关于", handler);
                eventArgs.Request.ApplicationCommands.Add(aboutCommand);
    
                SettingsCommand contactCommand = new SettingsCommand("contactUs", "联系我们", handler);
                eventArgs.Request.ApplicationCommands.Add(contactCommand);
    
                SettingsCommand flyoutCommand = new SettingsCommand("flyout", "弹出一个类“设置”风格的详细设置页", handler);
                eventArgs.Request.ApplicationCommands.Add(flyoutCommand);
            }
    
            // 响应 SettingsPane 中的各个自定义设置项的命令
            void onSettingsCommand(IUICommand command)
            {
                SettingsCommand settingsCommand = (SettingsCommand)command;
                lblMsg.Text += string.Format("commandId:{0} - label:{1}", settingsCommand.Id.ToString(), settingsCommand.Label);
                lblMsg.Text += Environment.NewLine;
    
                // 通过 SettingsCommand.Id 来判断用户单机了哪个设置项
                if (settingsCommand.Id.ToString() == "flyout")
                {
                    // 详细设置页的宽度
                    double settingsPageWidth = 600;
    
                    // 设置用于携带详细设置页的 Popup 的基本属性
                    _settingsPopup.IsLightDismissEnabled = true;
                    _settingsPopup.Width = settingsPageWidth;
                    _settingsPopup.Height = Window.Current.Bounds.Height;
    
                    // 为弹出框增加 PaneThemeTransition 的效果
                    _settingsPopup.ChildTransitions = new TransitionCollection();
                    _settingsPopup.ChildTransitions.Add(new PaneThemeTransition()
                    {
                        Edge = EdgeTransitionLocation.Right
                    });
    
                    // 实例化自定义的详细设置页,并将其放到 Popup 内
                    CustomSettingsPage mySettingsPage = new CustomSettingsPage();
                    mySettingsPage.Width = settingsPageWidth;
                    mySettingsPage.Height = Window.Current.Bounds.Height;
                    _settingsPopup.Child = mySettingsPage;
    
                    // 指定 Popup 的显示位置
                    _settingsPopup.HorizontalOffset = Window.Current.Bounds.Width - settingsPageWidth;
                    _settingsPopup.VerticalOffset = 0;
                    _settingsPopup.IsOpen = true;
                }
            }
        }
    }


    自定义的详细设置页
    Contracts/SettingsContract/CustomSettingsPage.xaml

    <Page
        x:Class="XamlDemo.Contracts.SettingsContract.CustomSettingsPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:XamlDemo.Contracts.SettingsContract"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
            <!--
                详细设置页的左上角的返回按钮的样式
            -->
            <Style x:Key="SettingsBackButtonStyle" TargetType="Button">
                <Setter Property="MinWidth" Value="0"/>
                <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
                <Setter Property="FontWeight" Value="Normal"/>
                <Setter Property="FontSize" Value="26.66667"/>
                <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>
                <Setter Property="AutomationProperties.Name" Value="Back"/>
                <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid x:Name="RootGrid" Width="30" Height="30">
                                <Grid Margin="-6,-6,0,0">
                                    <TextBlock x:Name="BackgroundGlyph" Text="&#xE0D4;" Foreground="Transparent"/>
                                    <TextBlock x:Name="NormalGlyph" Text="{StaticResource BackButtonSnappedGlyph}" Foreground="White"/>
                                    <TextBlock x:Name="ArrowGlyph" Text="&#xE0C4;" Foreground="#00b2f0" Opacity="0"/>
                                </Grid>
                                <Rectangle x:Name="FocusVisualWhite" IsHitTestVisible="False" Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" StrokeEndLineCap="Square" StrokeDashArray="1,1" Opacity="0" StrokeDashOffset="1.5" />
                                <Rectangle x:Name="FocusVisualBlack" IsHitTestVisible="False" Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" StrokeEndLineCap="Square" StrokeDashArray="1,1" Opacity="0" StrokeDashOffset="0.5" />
                                <VisualStateManager.VisualStateGroups>
                                    <VisualStateGroup x:Name="CommonStates">
                                        <VisualState x:Name="Normal" />
                                        <VisualState x:Name="PointerOver">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
                                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverBackgroundThemeBrush}"/>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Pressed">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
                                                    <DiscreteObjectKeyFrame KeyTime="0" Value="White"/>
                                                </ObjectAnimationUsingKeyFrames>
                                                <DoubleAnimation Storyboard.TargetName="ArrowGlyph" Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
                                                <DoubleAnimation Storyboard.TargetName="NormalGlyph" Storyboard.TargetProperty="Opacity" To="0" Duration="0"/>
                                            </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Disabled">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Visibility">
                                                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                    </VisualStateGroup>
                                    <VisualStateGroup x:Name="FocusStates">
                                        <VisualState x:Name="Focused">
                                            <Storyboard>
                                                <DoubleAnimation Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
                                                <DoubleAnimation Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
                                            </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Unfocused" />
                                        <VisualState x:Name="PointerFocused" />
                                    </VisualStateGroup>
                                </VisualStateManager.VisualStateGroups>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Page.Resources>
    
        <Grid Background="Transparent" Name="root">
            <Border BorderBrush="Red" BorderThickness="1,0,0,0">
                <Grid Background="White">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="80"/>
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
    
                    <Grid Background="#00b2f0" Grid.Row="0">
                        <StackPanel Orientation="Horizontal" Margin="40, 32, 17, 13">
                            <!--返回按钮-->
                            <Button Name="btnBack" Click="btnBack_Click_1" Margin="0,3,0,0" Style="{StaticResource SettingsBackButtonStyle}"/>
                            <!--详细设置页的标题-->
                            <TextBlock Margin="10,0,0,0" FontFamily="Segoe UI" FontWeight="SemiLight" FontSize="24.6667" Text="Defaults" Foreground="White"/>
                        </StackPanel>
                    </Grid>
    
                    <ScrollViewer Grid.Row="1">
                        <!--详细设置页内的全部内容-->
                        <StackPanel>
                            <!--为详细设置页内的内容增加 EntranceThemeTransition 效果-->
                            <StackPanel.ChildrenTransitions>
                                <TransitionCollection>
                                    <PaneThemeTransition Edge="Right" />
                                </TransitionCollection>
                            </StackPanel.ChildrenTransitions>
                            <TextBlock FontSize="56" Foreground="Black" LineHeight="100">
                                <Run>设置1</Run>
                                <LineBreak />
                                <Run>设置2</Run>
                                <LineBreak />
                                <Run>设置3</Run>
                                <LineBreak />
                                <Run>设置4</Run>
                                <LineBreak />
                                <Run>设置5</Run>
                                <LineBreak />
                                <Run>设置6</Run>
                                <LineBreak />
                                <Run>设置7</Run>
                                <LineBreak />
                                <Run>设置8</Run>
                                <LineBreak />
                                <Run>设置9</Run>
                            </TextBlock>
                        </StackPanel>
                    </ScrollViewer>
                </Grid>
            </Border>
        </Grid>
    </Page>

    Contracts/SettingsContract/CustomSettingsPage.xaml.cs

    /*
     * 自定义的详细设置页
     */
    
    using Windows.UI.ApplicationSettings;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Media.Animation;
    using Windows.UI.Xaml.Navigation;
    
    namespace XamlDemo.Contracts.SettingsContract
    {
        public sealed partial class CustomSettingsPage : Page
        {
            public CustomSettingsPage()
            {
                this.InitializeComponent();
            }
    
            private void btnBack_Click_1(object sender, RoutedEventArgs e)
            {
                // 详细设置页的容器是 Popup,找到这个 Popup 并关闭它,从而关闭详细设置页
                Popup parent = this.Parent as Popup;
                if (parent != null)
                {
                    parent.IsOpen = false;
                }
    
                // 显示设置面板
                if (Windows.UI.ViewManagement.ApplicationView.Value != Windows.UI.ViewManagement.ApplicationViewState.Snapped)
                {
                    SettingsPane.Show();
                }
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    mysql关联更新like,CONCAT,Length 函数使用
    泛型类
    libwebp 解码 webp格式的图片或者动画【源码】
    windwos自带的 一个xml库 MSXML 兼容宽字符
    使用华为云的arm搭建gogs
    centos7 arm mysql 安装
    关于脱壳的一些笔记
    关于OD调试的一些笔记
    关于对《汇编语言》第3版 作者:王爽的阅读总结
    使用Proxifier + Fiddler 抓任何包
  • 原文地址:https://www.cnblogs.com/webabcd/p/3157985.html
Copyright © 2011-2022 走看看