背水一戰 Windows 10 (35) - 控制項(彈出類): FlyoutBase, Flyout, MenuFlyout

来源:http://www.cnblogs.com/webabcd/archive/2016/09/22/5894886.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 控制項(彈出類): 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
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建基於對話框的Win32應用程式(三) —— Checkbox的應用、窗體置頂、設置圖標 上一節創建的窗體應用程式中,我們用到了Button和StaticText這兩個控制項。這一節中我們將學習使用Checkbox控制項,並實現將窗體置頂的功能。 17、首先切換到Reasource View(Ctrl ...
  • 思路: 1、查看有無安裝過mysql 或 2、查看有無安裝包 3、安裝mysql服務端 4、啟動&&停止 a、設置資料庫預設字元 在mysql配置文件/etc/my.cnf中加入default-character-set=utf8 b、設置開機自啟動 c、啟動mysql 5、登錄 a、創建root管 ...
  • 今天,開始記錄我的前端技術生涯! 今天,開始記錄我的博客園生涯! 今天,技術!產品!技術+產品=能力!!! 開啟新的生活!!! ...
  • 創建基於對話框的Win32應用程式(二) —— Button的應用、新建子窗體 可以發現上一節創建的窗體中,點擊OK和Cancel兩個按鈕是沒有任何反應的。現在我們來為他們添加退出對話框的功能。 6、首先定義命令消息響應函數(Dlg_OnCommand)如下: 其中IDOK和IDCANCEL分別是按 ...
  • 一.創建一個空項目 請查看 新建 .NET Core 項目 -- Hello World! 一節,新建一個項目: 二.添加引用並修改配置為 Web API (.NET Core 已將 MVC/Web API 底層代碼及表層編程介面合二為一) 修改 .vscode\launch.json 文件 代碼如 ...
  • 下麵介紹各種List的sort的用法與比較 首先,我們建一個People的實體,有name、age、sex的屬性,我們要排序的欄位是年齡age 新建一個實體類 新建list的數據 1. 第1種排序方法,使用 IComparer 可以看到第一種方法比價麻煩,要新建一個新的類來做 2. 第2種排序方法, ...
  • 一、併發的基本含義 在操作系統中,併發是指一個時間段中有幾個程式都處於已啟動運行到運行完畢之間,且這幾個程式都是在同一個處理機上運行,但任一個時刻點上只有一個程式在處理機上運行。 在關係資料庫中,允許多個用戶同時訪問和更改共用數據的進程。SQL Server 使用鎖定以允許多個用戶同時訪問和更改共用 ...
  • Web 應用程式使用的 Cookie 個人認為這裡設置的cookie與訪問cookie的安全性關聯大一點,配置節如下 httpOnlyCookies:預設是false,作用是是否禁用瀏覽器腳本訪問cookie。在Form認證時會頒發一個認證票寫在cookie,最開始我以為這裡設置了則可以訪問,結果並 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...