背水一戰 Windows 10 (77) - 控制項(控制項基類): ContentControl, UserControl, Page

来源:http://www.cnblogs.com/webabcd/archive/2017/12/11/8021516.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 控制項(控制項基類 - ContentControl, UserControl, Page): ContentPresenter, ContentControl, UserControl, Page ...


[源碼下載]


背水一戰 Windows 10 (77) - 控制項(控制項基類): ContentControl, UserControl, Page



作者:webabcd


介紹
背水一戰 Windows 10 之 控制項(控制項基類 - ContentControl, UserControl, Page)

  • ContentPresenter
  • ContentControl
  • UserControl
  • Page



示例
1、演示 ContentPresenter 的基礎知識
Controls/BaseControl/ContentControlDemo/ContentPresenterDemo.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.ContentControlDemo.ContentPresenterDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.ContentControlDemo"
    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">

            <ContentControl Width="400" Margin="5" Content="我是 ContentControl" HorizontalAlignment="Left">
                <ContentControl.Template>
                    <ControlTemplate>
                        <Border BorderBrush="Red" BorderThickness="1">
                            <Grid Background="Yellow">
                                <!--
                                    ContentPresenter - 用來呈現 ContentControl 的 Content
                                        有一堆屬性,相關說明請參見文檔
                                -->
                                <ContentPresenter HorizontalAlignment="Right" Foreground="Black" FontSize="24" Padding="20" />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </ContentControl.Template>
            </ContentControl>

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

Controls/BaseControl/ContentControlDemo/ContentPresenterDemo.xaml.cs

/*
 * ContentPresenter - 用來呈現 ContentControl 的 Content(繼承自 FrameworkElement, 請參見 /Controls/BaseControl/FrameworkElementDemo/)
 * 
 * 
 * 註:關於如何創建自定義的 ContentPresenter 請參見 /Controls/CollectionControl/ItemsControlDemo/MyItemPresenterDemo.xaml
 */

using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.BaseControl.ContentControlDemo
{
    public sealed partial class ContentPresenterDemo : Page
    {
        public ContentPresenterDemo()
        {
            this.InitializeComponent();
        }
    }
}


2、演示 ContentControl 的基礎知識
Controls/BaseControl/ContentControlDemo/ContentControlDemo.xaml

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

    <Page.Resources>
        <!--
            DataTemplate - 數據模板(其是 xaml 語言使用的一種方案,無法在 c# 中定義)
        -->
        <DataTemplate x:DataType="common:Employee" x:Key="DataTemplateMale">
            <Grid Background="Blue">
                <TextBlock Text="{x:Bind Name}" />
            </Grid>
        </DataTemplate>
        <DataTemplate x:DataType="common:Employee" x:Key="DataTemplateFemale">
            <Grid Background="Pink">
                <TextBlock Text="{x:Bind Name}" />
            </Grid>
        </DataTemplate>

        <!--
            自定義數據模板選擇器(參見 code-behind 中的代碼)
        -->
        <local:MyDataTemplateSelector x:Key="MyDataTemplateSelector" 
                                      DataTemplate1="{StaticResource DataTemplateMale}"
                                      DataTemplate2="{StaticResource DataTemplateFemale}" />
    </Page.Resources>

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

            <Button Name="button" Content="換個人" Click="button_Click" Margin="5" />

            <ContentControl Name="contentControl" Width="400" Margin="5" HorizontalAlignment="Left"
                            ContentTemplateSelector="{StaticResource MyDataTemplateSelector}">
                <ContentControl.ContentTransitions>
                    <TransitionCollection>
                        <ContentThemeTransition/>
                    </TransitionCollection>
                </ContentControl.ContentTransitions>
            </ContentControl>

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

Controls/BaseControl/ContentControlDemo/ContentControlDemo.xaml.cs

/*
 * ContentControl - ContentControl(繼承自 Control, 請參見 /Controls/BaseControl/ControlDemo/)
 *     Content - 呈現的內容
 *     ContentTemplate - 數據模板(DataTemplate)
 *     ContentTemplateSelector - 數據模板選擇器(如果指定了 ContentTemplate 則此配置無效)
 *     ContentTemplateRoot - 用於獲取當前數據模板的根元素(寫自定義 ContentControl 時會用到)
 *     ContentTransitions - Content 發生變化時的過度效果
 */

using System;
using System.Collections.Generic;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows10.Common;

namespace Windows10.Controls.BaseControl.ContentControlDemo
{
    public sealed partial class ContentControlDemo : Page
    {
        private IList<Employee> Employees { get; set; } = TestData.GetEmployees(100);

        public ContentControlDemo()
        {
            this.InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            // 註:
            // 在 Content 發生變化時會觸發 ContentTemplateSelector 和 ContentTransitions(如果只是 DataContext 發生變化則不會有此效果)
            // 所以如果需要 ContentTemplateSelector 和 ContentTransitions 的話,則應該直接設置 ContentControl 的 Content 而不是 DataContext
            contentControl.Content =  Employees[new Random().Next(0, 100)];
        }
    }

    // 自定義 DataTemplateSelector(數據模板選擇器)
    // 可以實現在 runtime 時,根據 item 的不同選擇不同的數據模板
    public class MyDataTemplateSelector : DataTemplateSelector
    {
        // 數據模板 1(配置在 xaml 端)
        public DataTemplate DataTemplate1 { get; set; }

        // 數據模板 2(配置在 xaml 端)
        public DataTemplate DataTemplate2 { get; set; }

        // 根據 item 的數據的不同,指定的不同的模板
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            var employee = item as Employee;
            if (employee == null || employee.IsMale)
                return DataTemplate1; // 男員工用數據模板 1
            return DataTemplate2; // 女員工用數據模板 2

            // 如果想直接返回指定的資源也是可以的(但是不靈活),類似:return (DataTemplate)Application.Current.Resources["DataTemplateMale"];
        }
    }
}


3、演示 UserControl 的基礎知識
Controls/BaseControl/UserControlDemo/UserControlDemo.xaml

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

    <Grid Background="Transparent">

        <UserControl Margin="10 0 10 10" HorizontalAlignment="Left" VerticalAlignment="Top">
            <UserControl.Content>
                <Rectangle Width="300" Height="100" Fill="Orange" />
            </UserControl.Content>
        </UserControl>

        <!--
            UserControl 有一個 [ContentProperty(Name = "Content")] 聲明,所以在寫 xaml 的時候可以省略掉 UserControl.Content
        -->
        <UserControl Margin="10 130 10 10" HorizontalAlignment="Left" VerticalAlignment="Top">
            <Rectangle Width="300" Height="100" Fill="Orange" />
        </UserControl>

    </Grid>
</Page>

Controls/BaseControl/UserControlDemo/UserControlDemo.xaml.cs

/*
 * UserControl - UserControl(繼承自 Control, 請參見 /Controls/BaseControl/ControlDemo/)
 *     Content - 呈現的內容
 */

using Windows.UI.Xaml.Controls;

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


4、演示 Page 的基礎知識
Controls/BaseControl/PageDemo/PageDemo.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.PageDemo.PageDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.PageDemo"
    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/BaseControl/PageDemo/PageDemo.xaml.cs

/*
 * Page - Page(繼承自 UserControl, 請參見 /Controls/BaseControl/UserControlDemo/)
 *     TopAppBar, BottomAppBar - 參見 /Controls/NavigationControl/AppBarDemo.xaml 和 /Controls/NavigationControl/CommandBarDemo.xaml
 *     NavigationCacheMode, OnNavigatedFrom(), OnNavigatingFrom(), OnNavigatingFrom() - 參見 /Controls/NavigationControl/FrameDemo.xaml
 *     Frame - 獲取當前 Page 的所屬 Frame
 */

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

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

            this.Loading += page_Loading;
            this.Loaded += page_Loaded;
            this.Unloaded += page_Unloaded;
        }


        // 在 OnNavigatedTo 之後,由外到內觸發 Loading 事件,由內到外觸發 Loaded 事件;在 OnNavigatedFrom 之後,由外到內觸發 Unloaded 事件(參見 /Controls/BaseControl/FrameworkElementDemo/Demo2.xaml.cs)
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            lblMsg.Text += "OnNavigatedTo";
            lblMsg.Text += Environment.NewLine;
        }
        protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            Debug.WriteLine("OnNavigatingFrom");
        }
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            Debug.WriteLine("OnNavigatedFrom");
        }


        // 在 OnNavigatedTo 之後,由外到內觸發 Loading 事件,由內到外觸發 Loaded 事件;在 OnNavigatedFrom 之後,由外到內觸發 Unloaded 事件(參見 /Controls/BaseControl/FrameworkElementDemo/Demo2.xaml.cs)
        private void page_Loading(FrameworkElement sender, object args)
        {
            lblMsg.Text += "page_Loading";
            lblMsg.Text += Environment.NewLine;
        }
        private void page_Loaded(object sender, RoutedEventArgs e)
        {
            lblMsg.Text += "page_Loaded";
            lblMsg.Text += Environment.NewLine;
        }
        private void page_Unloaded(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("page_Unloaded");
        }
    }
}



OK
[源碼下載]


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

-Advertisement-
Play Games
更多相關文章
  • 在開發項目時,有時候需要用到上傳功能,比如頭像上傳等,其文件會保存到伺服器中。但是我發現在用eclipse做項目的過程中,每次重新部署項目,原來上傳的文件就會丟失。 其原因是因為每次項目修改後,eclipse會把我們放在工作空間workspace中的這個項目拷貝到伺服器下(如tomcat的webap ...
  • ...
  • 在學習有關java枚舉的時候,我們知道了所有的枚舉類型均是繼承自java.lang.Enum類的,且所有的枚舉常量均是該枚舉類型的一個對象,且對象名即為該枚舉常量的名稱。例子如下:源碼: 反編譯後的代碼: 在寫代碼的時候,由於輸入法切換的問題,發現枚舉常量的常量名稱居然是可以使用中文的。代碼如下: ...
  • 一、PTA實驗作業 題目1:查驗身份證 1. 本題PTA提交列表 2. 設計思路 3.代碼截圖 4.本題調試過程碰到問題及PTA提交列表情況說明。 部分正確 :將x改為大寫x 題目2:藏頭詩 1. 本題PTA提交列表 2. 設計思路 3.代碼截圖 4.本題調試過程碰到問題及PTA提交列表情況說明。 ...
  • 使用會話維持狀態 一、會話 為了實現關聯同一個用戶端的多個請求和這些請求之間數據的共用,需要用到會話,會話用於維持請求和請求之間的狀態。從伺服器的角度,當用戶的Web瀏覽器打開第一個鏈接到伺服器的套接字時請求就開始了,直到伺服器返回最後一個數據包並關閉鏈接是,該請求將結束。此時用戶瀏覽器和伺服器之間 ...
  •   枚舉是如何保證線程安全的且其在序列化和反序列化的操作中是單例的?   要想看源碼,首先得有一個類吧,那麼枚舉類型到底是什麼類呢?是enum嗎?答案很明顯不是,enum就和class一樣,只是一個關鍵字,他並不是一個類,那麼枚舉是由什麼類維護的呢,我們簡單的 ...
  • 用法一:常量   在JDK1.5 之前,我們定義常量都是: public static fianl....。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型里,而且枚舉提供了比常量更多的方法。 用法二:switch   JDK1.6之前的switch語句 ...
  • 1.首先需要在操作系統上安裝Git分散式管理系統 此處自行百度。。。。。。。。。。。。。 2.在Intellij IDEA中配置Git 打開Settings(File-->Settings) --> 在搜索欄內輸入git,回車跳轉到Git配置頁面 --> 將git的運行路徑填入Path to Git ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...