【WPF學習】第二十一章 特殊容器

来源:https://www.cnblogs.com/Peter-Luo/archive/2020/02/02/12250037.html
-Advertisement-
Play Games

內容控制項不僅包括基本控制項,如標簽、按鈕以及工具提示;它們還包含特殊容器,這些容器可用於構造用戶界面中比較大的部分區域。 首先介紹ScrollViewer控制項,該控制項直接繼承自ContentControl類,提供了虛擬界面,允許用戶圍繞更大的元素滾動。與所有內容控制項一樣,ScrollViewer只能包 ...


  內容控制項不僅包括基本控制項,如標簽、按鈕以及工具提示;它們還包含特殊容器,這些容器可用於構造用戶界面中比較大的部分區域。

  首先介紹ScrollViewer控制項,該控制項直接繼承自ContentControl類,提供了虛擬界面,允許用戶圍繞更大的元素滾動。與所有內容控制項一樣,ScrollViewer只能包含單個元素,雖然如此,你仍可在內部放置佈局容器來保存自己需要的任意類型的元素。

  此後將分析附加繼承層中的另外三個控制項:GroupBox、TabItem以及Expander。所有這些控制項都繼承自HeaderedContentControl類,HeaderedContentControl又繼承自ContentControl類。HeaderedContentControl類的作用十分簡單,它表示包含單一元素內容(存儲在Content屬性中)和單一元素標題(存儲在Header屬性中)的容器。正是由於添加了標題,才使HeaderedContentControl與前面章節介紹的內容控制項區別開來。重申一次,可使用標題和或內容的佈局容器,將內容封裝在HeaderedContentControl中。

一、ScrollViewer

  如果希望讓大量內容適應有限的空間,滾動是重要特性之一。在WPF中為了獲得滾動支持,需要在ScrollViewer控制項中封裝希望滾動的內容。

  儘管ScrollViewer控制項可以包含任何內容,但通常用來封裝佈局容器。如下示例中,使用Grid元素創建三列,用於顯示文本、文本框和按鈕。為使這個Grid面板能夠滾動,只需將Grid面板封裝到ScrollViewer控制項中,如下麵的標記所示:

 <ScrollViewer Name="scroller">

            <Grid Margin="0,10,0,0" Focusable="False">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition Width="*" MinWidth="50" MaxWidth="800"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>

                <Label Grid.Row="0" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Home:</Label>
                <TextBox Grid.Row="0" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="0" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="1" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Network:</Label>
                <TextBox Grid.Row="1" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="1" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="2" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Web:</Label>
                <TextBox Grid.Row="2" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="2" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="3" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Secondary:</Label>
                <TextBox Grid.Row="3" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="3" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="4" Grid.Column="0" Margin="3"
       VerticalAlignment="Center">Home:</Label>
                <TextBox Grid.Row="4" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="4" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="5" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Network:</Label>
                <TextBox Grid.Row="5" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="5" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="6" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Web:</Label>
                <TextBox Grid.Row="6" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="6" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="7" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Secondary:</Label>
                <TextBox Grid.Row="7" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="7" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

            </Grid>

        </ScrollViewer>
ScrollViewer

  最終效果如下圖所示:

 

 

   在該例中,如果改變視窗的尺寸以使視窗足以容納所有內容,將會禁用滾動條。但仍會顯示滾動條,可通過設置VerticalScrollBarVisibility屬性來控制這一行為,該屬性使用ScrollBarVisibility枚舉值。預設值 Visible確保總是提供垂直滾動條。如果希望當需要時顯示滾動條而當不需要時不顯示,可將該屬性設置為Auto。如果根本就不希望顯示滾動條,可將該屬性設置為Disable。

  ScrollViewer控制項也支持水平滾動功能。但預設情況下,HorizontalScrollBarVisibility屬性設置為Hidden。為了使用水平滾動功能,需要將該屬性改為Visible或Auto。

  1、通過代碼進行滾動

  為滾動上圖中顯示的視窗,可使用滑鼠單擊滾動條,將滑鼠移到網路上並使用滑鼠滾輪進行滾動,可使用Tab鍵查看控制項,或單擊網格控制項的空白處並使用向上或向下的方向鍵進行滾動。如果這些還不夠靈活,還可使用ScrollViewer類提供的方法,通過代碼來滾動內容:

  •   最明顯的方法是LineUp()和LineDown(),這兩個方法向上和向下移動的效果相當於單擊一次垂直滾動條兩端的箭頭按鈕。
  •   還可使用PageUp()和PageDown()方法,這兩個方法向上或向下滾動一整屏,相當於在滾動滑塊的上面或下麵單擊滾動條
  •   用於水平滾動的類似方法包括LineLeft()、LineRight()、PageLeft()和PageRight()
  •   最後,還可使用ScrollToXxx()這一類方法,從而滾動到任何特定位置。對於垂直滾動,包括ScrollToEnd()和ScrollToHome(),這兩個方法可以滾動到內容的頂部和底部。還有ScrollToVerticalOffset(),該方法可滾動到特定位置。對於水平滾動也有類似的方法,包括ScrollToLeftEnd()、ScrollToRightEnd()和ScrollToHorizontalOffset()。

  現在創建一個簡單的示例,代碼如下所示:

<Window x:Class="Controls.ScrollableTextBoxColumn"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ScrollableTextBoxColumn" Height="230.075" Width="300">
    <DockPanel>
        <Border DockPanel.Dock="Top"  BorderBrush="SteelBlue" BorderThickness="2">
            <StackPanel Margin="5" Orientation="Horizontal">
                <Button Padding="3" Click="LineUp">Line Up</Button>
                <Button Padding="3" Click="LineDown">Line Down</Button>
                <Button Padding="3" Click="PageUp">Page Up</Button>
                <Button Padding="3" Click="PageDown">Page Down</Button>
            </StackPanel>
        </Border>
        <ScrollViewer Name="scroller">

            <Grid Margin="0,10,0,0" Focusable="False">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition Width="*" MinWidth="50" MaxWidth="800"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>

                <Label Grid.Row="0" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Home:</Label>
                <TextBox Grid.Row="0" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="0" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="1" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Network:</Label>
                <TextBox Grid.Row="1" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="1" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="2" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Web:</Label>
                <TextBox Grid.Row="2" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="2" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="3" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Secondary:</Label>
                <TextBox Grid.Row="3" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="3" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="4" Grid.Column="0" Margin="3"
       VerticalAlignment="Center">Home:</Label>
                <TextBox Grid.Row="4" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="4" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="5" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Network:</Label>
                <TextBox Grid.Row="5" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="5" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="6" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Web:</Label>
                <TextBox Grid.Row="6" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="6" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

                <Label Grid.Row="7" Grid.Column="0" Margin="3"
             VerticalAlignment="Center">Secondary:</Label>
                <TextBox Grid.Row="7" Grid.Column="1" Margin="3"
             Height="Auto"  VerticalAlignment="Center"></TextBox>
                <Button Grid.Row="7" Grid.Column="2" Margin="3" Padding="2">Browse</Button>

            </Grid>

        </ScrollViewer>
    </DockPanel>
</Window>
ScrollableTextBoxColumn.xaml
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Controls
{
    /// <summary>
    /// ScrollableTextBoxColumn.xaml 的交互邏輯
    /// </summary>
    public partial class ScrollableTextBoxColumn : Window
    {
        public ScrollableTextBoxColumn()
        {
            InitializeComponent();
        }
        private void LineUp(object sender, RoutedEventArgs e)
        {
            scroller.LineUp();
        }
        private void LineDown(object sender, RoutedEventArgs e)
        {
            scroller.LineDown();
        }
        private void PageUp(object sender, RoutedEventArgs e)
        {
            scroller.PageUp();
        }
        private void PageDown(object sender, RoutedEventArgs e)
        {
            scroller.PageDown();
        }
    }
}
ScrollableTextBoxColumn.xaml.cs

  最終效果如下所示:

   2、自定義滾動條

  ScrollViewer控制項內置的滾動功能是很有用的。該功能允許緩慢滾動任何內容,從複雜的矢量圖形乃至元素網格。不過,ScrollViewer控制項最奇特的特征是允許其包含的內容參與滾動過程。下麵是工作原理:

  (1)在ScrollViewer控制項中放置能滾動的元素,可以是實現了IScrollInfo介面的任意元素。

  (2)通過將ScrollViewer.CanContentScroll屬性設置為true,告訴ScrollViewer控制項其內容知道如何進行滾動。

  (3)當和ScrollViewer控制項進行交互時(通過使用滾動條、滑鼠輪和滾動方法等),ScrollViewer控制項通過IScrollInfo介面來調用元素的恰當方法。元素接著執行它自己的自定義滾動功能。

  IScrollInfo介面定義了一套方法,這套方法響應不同的滾動動作。例如,它包含了ScrollViewer控制項提供的許多滾動方法,如LineUp()、LineDown()、PageUp()以及PageDown()。它還定義了一些處理滑鼠滾輪的方法。

  實現了IScrollInfo介面的元素極少,其中一個元素是StackPanel面板容器。StackPanel類對IScrollInfo介面的實現使用邏輯滾動,從元素滾動到元素,而不是逐行滾動。

  如果在ScrollViewer控制項中放置StackPanel面板,而且不設置CanContentScroll,將得到普通的滾動行為。一次可向上或向下滾動幾個像素。但如果將CanContentScroll屬性設置為true,那麼每次單擊時會滾動到下一個元素的開頭:

<ScrollViewer CanContentScroll="True">
        <StackPanel>
            <Button Height="100">1</Button>
            <Button Height="100">2</Button>
            <Button Height="100">3</Button>
            <Button Height="100">4</Button>
        </StackPanel>
    </ScrollViewer>

  StackPanel面板的邏輯滾動系統對應用程式可能有用也可能沒用。但是,如果要創建具有特殊滾動行為的自定義面板,它是必不可少的。

二、GroupBox

  GroupBox是這三個繼承自HeaderedContentControl類的控制項中最簡單的一個。它顯示為具有圓角和標題的方框。下麵是一個示例,下過如下圖所示:

<Window x:Class="Controls.GroupBoxDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="GroupBoxDemo" Height="300" Width="300">
    <Grid>
        <GroupBox Header="A GroupBox Test" Padding="5" Margin="5" VerticalAlignment="Top">
            <StackPanel>
                <RadioButton Margin="3">One</RadioButton>
                <RadioButton Margin="3">Two</RadioButton>
                <RadioButton Margin="3">Three</RadioButton>
                <Button  Margin="3">Save</Button>
            </StackPanel>
        </GroupBox>
    </Grid>
</Window>
GroupBoxDemo

 

 三、TabItem

  TabItem表示TabControl控制項中的一頁。TabItem類添加的唯一有意義的屬性是IsSelected,該屬性只是選項卡(tab)當前是否顯示在TabControl控制項中。下麵是創建簡單示例:

<Window x:Class="Controls.TabItemDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大綱 一.什麼是Hash?什麼是HashMap? 二.HashMap的內部實現機制 1.HashMap基本元素 ①DEFAULT_INITIAL_CAPACITY&MAXIMUM_CAPACITY ②DEFAULT_LOAD_FACTOR&loadFactor ③size&threshold 2.H ...
  • th:href="@{/static/css/style.css}" th:src="@{/static/js/thymeleaf.js}" index.html <head> <meta charset="UTF-8"> <title>首頁</title> <link rel="styleshee ...
  • 網上的教程大都是手動通過protoc編譯, 比較難用 給當前工程添加"Google.Protobuf"和"Grpc.Tools"的引用(通過nuget), 然後添加proto文件, 編輯.csproj文件 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGrou ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 同上篇文章《少量代碼設計一個登錄界面》,本篇介紹另一種登錄界面設計風格。 2 ...
  • 這是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:。 1. "第1部分 使用Serilog RequestLogging減少日誌詳細程度" 2. "第2部分 使用Serilog記錄所選的終結點屬性" 3. "第3部分 使用Serilog.AspN ...
  • 實例2.1 通過控制台實現對Excel的自動化處理 書本第32頁 註:添加兩個引用: 第一個:程式集—框架—“System.Windows.Forms 4.0.0.0”第二個:程式集—擴展—“Microsoft.Office.Interop.Excel 14.0.0.0” 程式清單2.1通過控制台程 ...
  • WPF提供了許多封裝項的集合的控制項,本章介紹簡單的ListBox和ComboBox控制項,後續哈會介紹更特殊的控制項,如ListView、TreeView和ToolBar控制項。所有這些控制項都繼承自ItemsControl類(ItemsControl類本身又繼承自Control類)。 ItemsContr ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 少量代碼設計一個登錄界面 .NET CORE(C ) WPF開發 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 繼續 Ma ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...