首页 > 代码库 > 背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout

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

[源码下载]


背水一战 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
[源码下载]

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