zoukankan      html  css  js  c++  java
  • 背水一战 Windows 10 (35)

    [源码下载]


    背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout



    作者:webabcd


    介绍
    背水一战 Windows 10 之 控件(弹出类)

    • FlyoutBase
    • Flyout
    • MenuFlyout



    示例
    1、FlyoutBase(基类) 的示例
    Controls/FlyoutControl/FlyoutBaseDemo.xaml

    <Page
        x:Class="Windows10.Controls.FlyoutControl.FlyoutBaseDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Controls.FlyoutControl"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
    
            <!--
                通过资源的方式定义 flyout 的样式和内容
            -->
            <Flyout x:Key="MyFlyout">
                <StackPanel>
                    <TextBlock Text="我是 Flyout 中的内容" />
                </StackPanel>
            </Flyout>
    
        </Page.Resources>
        
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <!--
                    Flyout - 弹出框控件,继承自 FlyoutBase,下面介绍 FlyoutBase 的相关知识点
                        Placement - 弹出框的显示位置
                            Top - 目标元素的上边(默认值)
                            Bottom - 目标元素的下边
                            Left - 目标元素的左边
                            Right - 目标元素的右边
                            Full - 屏幕中央
                        Opening - 弹出框准备显示时触发的事件
                        Opened - 弹出框显示之后触发的事件
                        Closed - 弹出框隐藏之后触发的事件
                -->
    
    
                <!--
                    FlyoutBase 的用法 1
                    部分控件本身有 Flyout 属性,比如 Button 控件,可以通过其 Flyout 属性直接为其绑定 FlyoutBase 控件及行为(单击按钮后就会显示此 FlyoutBase 控件)
                -->
                <Button Name="button1" Margin="5" Content="按我弹出 Flyout">
                    <Button.Flyout>
                        <Flyout x:Name="flyout1" Placement="Right" Opening="flyout1_Opening" Opened="flyout1_Opened" Closed="flyout1_Closed">
                            <StackPanel>
                                <TextBlock>我是 Flyout 中的内容</TextBlock>
                                <Button x:Name="button1CloseFlyout" Click="button1CloseFlyout_Click">隐藏 Flyout</Button>
                            </StackPanel>
                        </Flyout>
                    </Button.Flyout>
                </Button>
                <TextBlock Name="lblMsg1" Margin="5" />
                
    
                <!--
                    FlyoutBase 的用法 2
                    通过附加属性 FlyoutBase.AttachedFlyout 为指定的控件绑定 FlyoutBase 控件(何时显示需要在 CodeBehind 中控制)
                -->
                <TextBlock Name="textBlock1" Margin="5" Text="按我弹出 Flyout" Tapped="textBlock1_Tapped" FontSize="18">
                    <FlyoutBase.AttachedFlyout>
                        <Flyout Placement="Right">
                            <TextBlock Text="我是 Flyout 中的内容" />
                        </Flyout>
                    </FlyoutBase.AttachedFlyout>
                </TextBlock>
    
                
                <!--
                    FlyoutBase 的用法 3
                    此用法同用法 2,不同之处在于这里把 flyout 的样式和内容放到资源中定义了
                -->
                <TextBlock Name="textBlock2" Margin="5" Text="按我弹出 Flyout" Tapped="textBlock2_Tapped" FontSize="18"
                           FlyoutBase.AttachedFlyout="{StaticResource MyFlyout}" />
    
    
                <!--
                    FlyoutBase 的用法 4
                    在 CodeBehind 中创建 FlyoutBase 控件后,将其绑定到指定的控件上,并显示
                -->
                <TextBlock Name="textBlock3" Margin="5" Text="按我弹出 Flyout" Tapped="textBlock3_Tapped" FontSize="18" />
    
    
                <!--
                    FlyoutBase 的用法 5
                    在 CodeBehind 中创建 FlyoutBase 控件后,在不设置绑定的情况下,使其显示在指定的控件上
                -->
                <TextBlock Name="textBlock4" Margin="5" Text="按我弹出 Flyout" Tapped="textBlock4_Tapped" FontSize="18" />
    
            </StackPanel>
        </Grid>
    </Page>

    Controls/FlyoutControl/FlyoutBaseDemo.xaml.cs

    /*
     * FlyoutBase(基类) - 弹出框控件基类(继承自 DependencyObject, 请参见 /Controls/BaseControl/DependencyObjectDemo.xaml)
     *     Hide() - 隐藏 Flyout
     *     ShowAt(FrameworkElement targetElement) - 在指定的 FrameworkElement 上显示指定的 Flyout
     *
     *     FlyoutBase.SetAttachedFlyout(FrameworkElement element, FlyoutBase value) - 在指定的 FrameworkElement 上绑定指定的 Flyout
     *     FlyoutBase.GetAttachedFlyout(FrameworkElement element) - 获取指定的 FrameworkElement 上绑定的 Flyout
     *     FlyoutBase.ShowAttachedFlyout(FrameworkElement flyoutOwner) - 在指定的 FrameworkElement 上显示其绑定的 Flyout
     *
     *
     * 注:点击 FlyoutBase 外部的话,FlyoutBase 会自动关闭
     * 
     * 另外,在 uwp 中不再支持 SettingsFlyout 了
     */
    
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Input;
    
    namespace Windows10.Controls.FlyoutControl
    {
        public sealed partial class FlyoutBaseDemo : Page
        {
            public FlyoutBaseDemo()
            {
                this.InitializeComponent();
            }
    
    
            private void flyout1_Opening(object sender, object e)
            {
                lblMsg1.Text = "Flyout 打开中";
            }
            private void flyout1_Opened(object sender, object e)
            {
                lblMsg1.Text = "Flyout 已打开";
            }
            private void flyout1_Closed(object sender, object e)
            {
                lblMsg1.Text = "Flyout 已关闭";
            }
            private void button1CloseFlyout_Click(object sender, RoutedEventArgs e)
            {
                flyout1.Hide();
            }
    
    
            private void textBlock1_Tapped(object sender, TappedRoutedEventArgs e)
            {
                FlyoutBase.ShowAttachedFlyout(textBlock1);
            }
    
    
            private void textBlock2_Tapped(object sender, TappedRoutedEventArgs e)
            {
                FlyoutBase flyout = FlyoutBase.GetAttachedFlyout(textBlock2);
                flyout.Placement = FlyoutPlacementMode.Right;
    
                FlyoutBase.ShowAttachedFlyout(textBlock2);
            }
    
    
            // 在 CodeBehind 中创建 FlyoutBase 控件后,将其绑定到指定的控件上,并显示
            private void textBlock3_Tapped(object sender, TappedRoutedEventArgs e)
            {
                TextBlock flyoutContent = new TextBlock();
                flyoutContent.Text = "我是 Flyout 中的内容";
    
                Flyout flyout = new Flyout();
                flyout.Placement = FlyoutPlacementMode.Right;
                flyout.Content = flyoutContent;
    
                FlyoutBase.SetAttachedFlyout(textBlock3, flyout);
                FlyoutBase.ShowAttachedFlyout(textBlock3);
            }
    
    
            // 在 CodeBehind 中创建 FlyoutBase 控件后,在不设置绑定的情况下,使其显示在指定的控件上
            private void textBlock4_Tapped(object sender, TappedRoutedEventArgs e)
            {
                TextBlock flyoutContent = new TextBlock();
                flyoutContent.Text = "我是 Flyout 中的内容";
    
                Flyout flyout = new Flyout();
                flyout.Placement = FlyoutPlacementMode.Right;
                flyout.Content = flyoutContent;
    
                flyout.ShowAt(textBlock4);
            }
        }
    }


    2、Flyout 的示例
    Controls/FlyoutControl/FlyoutDemo.xaml

    <Page
        x:Class="Windows10.Controls.FlyoutControl.FlyoutDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Controls.FlyoutControl"
        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">
    
                <!--
                    Flyout - 弹出框控件
                        FlyoutPresenterStyle - 用于定义 Flyout 的样式
                -->
                
                <!--
                    xaml 方式指定 flyout
                -->
                <Button Name="button1" Margin="5" Content="按我弹出 Flyout">
                    <Button.Flyout>
                        <Flyout Placement="Right">
                            <StackPanel>
                                <TextBlock Text="我是 Flyout 中的内容" Foreground="White" FontSize="24" />
                            </StackPanel>
                            <Flyout.FlyoutPresenterStyle>
                                <Style TargetType="FlyoutPresenter">
                                    <Setter Property="ScrollViewer.ZoomMode" Value="Enabled"/>
                                    <Setter Property="Background" Value="Blue"/>
                                    <Setter Property="BorderBrush" Value="Red"/>
                                    <Setter Property="BorderThickness" Value="10"/>
                                    <Setter Property="MinHeight" Value="300"/>
                                    <Setter Property="MinWidth" Value="300"/>
                                </Style>
                            </Flyout.FlyoutPresenterStyle>
                        </Flyout>
                    </Button.Flyout>
                </Button>
    
                <!--
                    code-behind 方式指定 flyout
                -->
                <TextBlock Name="textBlock1" Margin="5" Text="按我弹出 Flyout" Tapped="textBlock1_Tapped" FontSize="18" />
    
            </StackPanel>
        </Grid>
    </Page>

    Controls/FlyoutControl/FlyoutDemo.xaml.cs

    /*
     * Flyout - 弹出框控件(继承自 FlyoutBase, 请参见 /Controls/FlyoutControl/FlyoutBaseDemo.xaml)
     *     Content - 获取或设置 Flyout 的内容
     */
    
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Input;
    
    namespace Windows10.Controls.FlyoutControl
    {
        public sealed partial class FlyoutDemo : Page
        {
            public FlyoutDemo()
            {
                this.InitializeComponent();
            }
    
            private void textBlock1_Tapped(object sender, TappedRoutedEventArgs e)
            {
                TextBlock flyoutContent = new TextBlock();
                flyoutContent.Text = "我是 Flyout 中的内容";
    
                Flyout flyout = new Flyout();
                flyout.Placement = FlyoutPlacementMode.Right;
                flyout.Content = flyoutContent;
    
                flyout.ShowAt(textBlock1);
            }
        }
    }


    3、MenuFlyout 的示例
    Controls/FlyoutControl/MenuFlyoutDemo.xaml

    <Page
        x:Class="Windows10.Controls.FlyoutControl.MenuFlyoutDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Controls.FlyoutControl"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
            <!--
                MenuFlyout - 菜单弹出框控件
                    Items - MenuFlyout 中包含的 item(MenuFlyoutItem, ToggleMenuFlyoutItem, MenuFlyoutSeparator)
            -->
            <MenuFlyout x:Key="MyMenuFlyout" Placement="Right">
                
                <!--
                    MenuFlyoutItem - MenuFlyout 中的 item
                        Text, Click, Command, CommandParameter
                
                    ToggleMenuFlyoutItem - MenuFlyout 中的可以 toggle 的 item
                        IsChecked, Text, Click, Command, CommandParameter
                
                    MenuFlyoutSubItem - 支持 sub item 的 item
                        Text, Items
                
                    MenuFlyoutSeparator - MenuFlyout 中的分隔符
                -->
                
                <MenuFlyoutItem Name="menuFlyoutItem1" Text="MenuFlyoutItem" Click="menuFlyoutItem1_Click" />
                <MenuFlyoutSeparator/>
                <ToggleMenuFlyoutItem Name="toggleMenuFlyoutItem1" Text="ToggleMenuFlyoutItem1" IsChecked="False" Click="toggleMenuFlyoutItem1_Click" />
                <ToggleMenuFlyoutItem Name="toggleMenuFlyoutItem2" Text="ToggleMenuFlyoutItem2" IsChecked="True" Click="toggleMenuFlyoutItem2_Click" />
    
                <MenuFlyoutSubItem Text="item">
                    <MenuFlyoutItem Text="item 1" />
                    <MenuFlyoutItem Text="item 2" />
                    <MenuFlyoutSubItem Text="item 3">
                        <MenuFlyoutItem Text="item 3 - 1" />
                        <MenuFlyoutItem Text="item 3 - 2" />
                    </MenuFlyoutSubItem>
                </MenuFlyoutSubItem>
    
                <!--
                    MenuFlyout.MenuFlyoutPresenterStyle - 用于定义 MenuFlyout 的样式
                -->
                <MenuFlyout.MenuFlyoutPresenterStyle>
                    <Style TargetType="MenuFlyoutPresenter">
                        <Setter Property="BorderBrush" Value="Red" />
                        <Setter Property="BorderThickness" Value="5" />
                    </Style>
                </MenuFlyout.MenuFlyoutPresenterStyle>
            </MenuFlyout>
    
        </Page.Resources>
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <TextBlock Name="lblMsg" Margin="5" />
    
                <Button Name="button1" Margin="5" Content="Options" Flyout="{StaticResource MyMenuFlyout}" />
    
                <TextBlock Name="textBlock1" Margin="5 20 5 5" Text="按我弹出 Flyout" Tapped="textBlock1_Tapped" FontSize="18" />
                
            </StackPanel>
        </Grid>
    </Page>

    Controls/FlyoutControl/MenuFlyoutDemo.xaml.cs

    /*
     * MenuFlyout - 菜单弹出框控件(继承自 FlyoutBase, 请参见 /Controls/FlyoutControl/FlyoutBaseDemo.xaml)
     *     ShowAt(UIElement targetElement, Point point) - 在指定的 UIElement 的指定位置(point 是相对于 targetElement 的位置)显示 MenuFlyout 控件
     */
    
    using Windows.Foundation;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Controls.FlyoutControl
    {
        public sealed partial class MenuFlyoutDemo : Page
        {
            public MenuFlyoutDemo()
            {
                this.InitializeComponent();
            }
    
            private void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)
            {
                lblMsg.Text = "MenuFlyoutItem 被 click 了";
            }
    
            private void menuFlyoutItem1_Click(object sender, RoutedEventArgs e)
            {
                lblMsg.Text = "menuFlyoutItem1 被 click 了";
            }
    
            private void toggleMenuFlyoutItem1_Click(object sender, RoutedEventArgs e)
            {
                lblMsg.Text = $"toggleMenuFlyoutItem1 被 click 了, IsChecked:{toggleMenuFlyoutItem1.IsChecked}";
            }
    
            private void toggleMenuFlyoutItem2_Click(object sender, RoutedEventArgs e)
            {
                lblMsg.Text = $"toggleMenuFlyoutItem2 被 click 了, IsChecked:{toggleMenuFlyoutItem2.IsChecked}";
            }
    
    
            private void textBlock1_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
            {
                MenuFlyout menuFlyout = this.Resources["MyMenuFlyout"] as MenuFlyout;
    
                // 对于基类的 ShowAt(FrameworkElement targetElement) 方法当然是支持的
                // menuFlyout.ShowAt(textBlock1);
    
                // 在 MenuFlyout 中重载了 ShowAt() 方法,即 ShowAt(UIElement targetElement, Point point)
                // 其中 point 代表 MenuFlyout 相对于 targetElement 左上角的显示位置(此时 MenuFlyout 的 Placement 参数就无效了)
                menuFlyout.ShowAt(textBlock1, new Point(10, 10));
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    java之redis篇(spring-data-redis整合) (转)
    web.xml
    点击类名方法名如何连接到相应的Android源代码
    eclipse能够自动提示变量名.
    Android自定义ActionBar
    Android 自定义View
    android 自定义titlebar
    Android SharedPreferences登录记住密码
    Android 正则表达式验证手机和邮箱格式是否正确
    Android 首次进入应用时加载引导界面
  • 原文地址:https://www.cnblogs.com/webabcd/p/5894886.html
Copyright © 2011-2022 走看看