久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【W(wǎng)PF學(xué)習(xí)】第二十一章 特殊容器

 Coder編程 2020-04-20

  內(nèi)容控件不僅包括基本控件,,如標(biāo)簽、按鈕以及工具提示,;它們還包含特殊容器,,這些容器可用于構(gòu)造用戶界面中比較大的部分區(qū)域。

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

  此后將分析附加繼承層中的另外三個(gè)控件:GroupBox、TabItem以及Expander,。所有這些控件都繼承自HeaderedContentControl類,,HeaderedContentControl又繼承自ContentControl類。HeaderedContentControl類的作用十分簡(jiǎn)單,,它表示包含單一元素內(nèi)容(存儲(chǔ)在Content屬性中)和單一元素標(biāo)題(存儲(chǔ)在Header屬性中)的容器,。正是由于添加了標(biāo)題,才使HeaderedContentControl與前面章節(jié)介紹的內(nèi)容控件區(qū)別開來(lái),。重申一次,,可使用標(biāo)題和或內(nèi)容的布局容器,將內(nèi)容封裝在HeaderedContentControl中,。

一,、ScrollViewer

  如果希望讓大量?jī)?nèi)容適應(yīng)有限的空間,滾動(dòng)是重要特性之一,。在WPF中為了獲得滾動(dòng)支持,,需要在ScrollViewer控件中封裝希望滾動(dòng)的內(nèi)容。

  盡管ScrollViewer控件可以包含任何內(nèi)容,,但通常用來(lái)封裝布局容器,。如下示例中,使用Grid元素創(chuàng)建三列,,用于顯示文本,、文本框和按鈕。為使這個(gè)Grid面板能夠滾動(dòng),,只需將Grid面板封裝到ScrollViewer控件中,,如下面的標(biāo)記所示:

 <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

  最終效果如下圖所示:

   在該例中,如果改變窗口的尺寸以使窗口足以容納所有內(nèi)容,,將會(huì)禁用滾動(dòng)條,。但仍會(huì)顯示滾動(dòng)條,,可通過(guò)設(shè)置VerticalScrollBarVisibility屬性來(lái)控制這一行為,該屬性使用ScrollBarVisibility枚舉值,。默認(rèn)值 Visible確??偸翘峁┐怪睗L動(dòng)條。如果希望當(dāng)需要時(shí)顯示滾動(dòng)條而當(dāng)不需要時(shí)不顯示,,可將該屬性設(shè)置為Auto。如果根本就不希望顯示滾動(dòng)條,,可將該屬性設(shè)置為Disable,。

  ScrollViewer控件也支持水平滾動(dòng)功能。但默認(rèn)情況下,,HorizontalScrollBarVisibility屬性設(shè)置為Hidden,。為了使用水平滾動(dòng)功能,需要將該屬性改為Visible或Auto,。

  1,、通過(guò)代碼進(jìn)行滾動(dòng)

  為滾動(dòng)上圖中顯示的窗口,可使用鼠標(biāo)單擊滾動(dòng)條,,將鼠標(biāo)移到網(wǎng)絡(luò)上并使用鼠標(biāo)滾輪進(jìn)行滾動(dòng),,可使用Tab鍵查看控件,或單擊網(wǎng)格控件的空白處并使用向上或向下的方向鍵進(jìn)行滾動(dòng),。如果這些還不夠靈活,,還可使用ScrollViewer類提供的方法,通過(guò)代碼來(lái)滾動(dòng)內(nèi)容:

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

  現(xiàn)在創(chuàng)建一個(gè)簡(jiǎn)單的示例,,代碼如下所示:

<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、自定義滾動(dòng)條

  ScrollViewer控件內(nèi)置的滾動(dòng)功能是很有用的,。該功能允許緩慢滾動(dòng)任何內(nèi)容,,從復(fù)雜的矢量圖形乃至元素網(wǎng)格。不過(guò),,ScrollViewer控件最奇特的特征是允許其包含的內(nèi)容參與滾動(dòng)過(guò)程,。下面是工作原理:

  (1)在ScrollViewer控件中放置能滾動(dòng)的元素,,可以是實(shí)現(xiàn)了IScrollInfo接口的任意元素,。

  (2)通過(guò)將ScrollViewer.CanContentScroll屬性設(shè)置為true,,告訴ScrollViewer控件其內(nèi)容知道如何進(jìn)行滾動(dòng),。

  (3)當(dāng)和ScrollViewer控件進(jìn)行交互時(shí)(通過(guò)使用滾動(dòng)條,、鼠標(biāo)輪和滾動(dòng)方法等),,ScrollViewer控件通過(guò)IScrollInfo接口來(lái)調(diào)用元素的恰當(dāng)方法。元素接著執(zhí)行它自己的自定義滾動(dòng)功能,。

  IScrollInfo接口定義了一套方法,,這套方法響應(yīng)不同的滾動(dòng)動(dòng)作。例如,,它包含了ScrollViewer控件提供的許多滾動(dòng)方法,,如LineUp()、LineDown(),、PageUp()以及PageDown(),。它還定義了一些處理鼠標(biāo)滾輪的方法。

  實(shí)現(xiàn)了IScrollInfo接口的元素極少,,其中一個(gè)元素是StackPanel面板容器,。StackPanel類對(duì)IScrollInfo接口的實(shí)現(xiàn)使用邏輯滾動(dòng),從元素滾動(dòng)到元素,,而不是逐行滾動(dòng),。

  如果在ScrollViewer控件中放置StackPanel面板,而且不設(shè)置CanContentScroll,,將得到普通的滾動(dòng)行為,。一次可向上或向下滾動(dòng)幾個(gè)像素。但如果將CanContentScroll屬性設(shè)置為true,,那么每次單擊時(shí)會(huì)滾動(dòng)到下一個(gè)元素的開頭:

<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面板的邏輯滾動(dòng)系統(tǒng)對(duì)應(yīng)用程序可能有用也可能沒用,。但是,如果要?jiǎng)?chuàng)建具有特殊滾動(dòng)行為的自定義面板,,它是必不可少的,。

二,、GroupBox

  GroupBox是這三個(gè)繼承自HeaderedContentControl類的控件中最簡(jiǎn)單的一個(gè)。它顯示為具有圓角和標(biāo)題的方框,。下面是一個(gè)示例,,下過(guò)如下圖所示:

<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控件中的一頁(yè),。TabItem類添加的唯一有意義的屬性是IsSelected,,該屬性只是選項(xiàng)卡(tab)當(dāng)前是否顯示在TabControl控件中。下面是創(chuàng)建簡(jiǎn)單示例:

<Window x:Class="Controls.TabItemDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TabItemDemo" Height="300" Width="300">
    <TabControl Margin="5">
        <TabItem Header="Tab One">
            <StackPanel Margin="5">
                <CheckBox Margin="3">Setting One</CheckBox>
                <CheckBox Margin="3">Setting Two</CheckBox>
                <CheckBox Margin="3">Setting Three</CheckBox>
            </StackPanel>
        </TabItem>
        <TabItem Header="Tab Two">
            <StackPanel Margin="5">
                <CheckBox Margin="3">Setted One</CheckBox>
                <CheckBox Margin="3">Setted Two</CheckBox>
                <CheckBox Margin="3">Setted Three</CheckBox>
            </StackPanel>
        </TabItem>
    </TabControl>
</Window>
TabItemDemo.xaml

  可以使用TabStripPlacement屬性,,使各個(gè)選項(xiàng)卡在選項(xiàng)卡控件的側(cè)邊顯示,,而不是在正常頂部位置顯示。

  與Content屬性意義,,Header屬性也可以接受任何類型的對(duì)象,。繼承自UIElement的類通過(guò)渲染來(lái)顯示,,對(duì)于內(nèi)斂文本以及其他所有對(duì)象則使用ToString()方法,。這意味著可以創(chuàng)建組合框或選項(xiàng)卡,在他們的標(biāo)題中包含圖形內(nèi)容或任意元素,。下面是一個(gè)示例:

<Window x:Class="Controls.GraphicalTabTitles"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="GraphicalTabTitles" Height="300" Width="300">
    <TabControl Margin="5" >
        <TabItem>
            <TabItem.Header>
                <StackPanel>
                    <TextBlock Margin="3">Image and Text Tab Title</TextBlock>
                    <Image Source="happyface.jpg" Stretch="None"></Image>
                </StackPanel>
            </TabItem.Header>
            <StackPanel Margin="5">
                <CheckBox Margin="3">Setting One</CheckBox>
                <CheckBox Margin="3">Setting Two</CheckBox>
                <CheckBox Margin="3">Setting Three</CheckBox>
            </StackPanel>
        </TabItem>
        <TabItem Header="Tab Two">
            <StackPanel Margin="5">
                <CheckBox Margin="3">Setted One</CheckBox>
                <CheckBox Margin="3">Setted Two</CheckBox>
                <CheckBox Margin="3">Setted Three</CheckBox>
            </StackPanel>
        </TabItem>
    </TabControl>
</Window>
GraphicalTabTitles

 四,、Expander

   最奇特的具有標(biāo)題的內(nèi)容控件是Expander控件。它封裝了一塊內(nèi)容,,通過(guò)單擊小箭頭按鈕可以顯示或隱藏所包含的內(nèi)容,。

  使用Expander控件是十分簡(jiǎn)單的——只需在該控件內(nèi)部包裝希望使其能夠折疊的內(nèi)容。通常,,每個(gè)Expander控件開始時(shí)都是折疊的,,但可在標(biāo)記中(或代碼中)通過(guò)設(shè)置IsExpanded屬性來(lái)改變這種行為。下面是一個(gè)簡(jiǎn)單Expander示例:

<Window x:Class="Controls.ExpandableContent"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ExpandableContent" Height="300" Width="300" SizeToContent="Height">
    <StackPanel>
        <Expander Margin="5" Padding="5"  Header="Region One"
                  BorderThickness="1" BorderBrush="Black">
            <Button Padding="3">Hidden Button One</Button>
        </Expander>
        <Expander Margin="5" Padding="5" Header="Region Two" 
            BorderThickness="1" BorderBrush="Black">
            <TextBlock TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam mi sapien, viverra et, lacinia varius, ullamcorper sed, sapien. Proin rutrum arcu vitae tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque libero dui, eleifend faucibus, auctor at, aliquet a, nulla. Nunc eros. Phasellus mauris nisi, eleifend nec, adipiscing nec, luctus nec, lacus. Aliquam justo metus, vestibulum non, accumsan id, hendrerit at, nibh. Praesent accumsan urna quis tortor. Proin erat libero, facilisis nec, rhoncus ut, malesuada ut, ipsum. Donec id nibh.
            </TextBlock>
        </Expander>
        <Expander Margin="5" Padding="5" Header="Region Three" IsExpanded="True"
              BorderThickness="1" BorderBrush="Black">
            <Button Padding="3">Hidden Button Two</Button>
        </Expander>
    </StackPanel>
</Window>
ExpandableContent

   還可以選擇擴(kuò)展器的方向,。上圖使用的是標(biāo)準(zhǔn)值(Down),,但也可將ExpandDirection樹上設(shè)置為Up、Left或Right,。當(dāng)折疊Expander時(shí),,箭頭始終指向?qū)⒁归_的方向。

  當(dāng)使用不同的ExpandDirection值,,情況就比較有趣了,,因?yàn)閷?duì)用戶界面其他部分的影響取決于容器的類型。有些容器(如WrapPanel面板)只要擠壓其他元素使其離開原來(lái)的位置,。其他容器,,如Grid面板,可以選擇按比例或自動(dòng)改變大小,。下面有一個(gè)示例使用不同展開程度,,該示例有一個(gè)具有4個(gè)單元格的網(wǎng)格,。每個(gè)單元格中都包含一個(gè)具有不同展開方向的擴(kuò)展器。例按比例改變其大小,,從而強(qiáng)制Expander控件中的文本進(jìn)行換行(自動(dòng)改變尺寸的列回簡(jiǎn)單地被拉伸以適應(yīng)文本,,使它比窗口還大)。行被設(shè)置為自動(dòng)改變尺寸,,所以會(huì)擴(kuò)展以容納附加的內(nèi)容,。

示例代碼如下所示:

<Window x:Class="Controls.MultiDirectionExpanders"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MultiDirectionExpanders" Height="327.2" Width="328.8">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition ></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Expander Margin="5" Padding="5" Header="Region One"
              BorderThickness="1" BorderBrush="Black">
            <TextBlock TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        Nam mi sapien, viverra et, lacinia varius, ullamcorper sed, sapien.
            </TextBlock>
        </Expander>
        <Expander Grid.Column="1" 
      Margin="5" Padding="5" Header="Region Two" ExpandDirection="Right"  
              BorderThickness="1" BorderBrush="Black">
            <TextBlock TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        Nam mi sapien, viverra et, lacinia varius, ullamcorper sed, sapien.
            </TextBlock>
        </Expander>
        <Expander Grid.Row="1"
      Margin="5" Padding="5" Header="Region Three" ExpandDirection="Up"
              BorderThickness="1" BorderBrush="Black">
            <TextBlock TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        Nam mi sapien, viverra et, lacinia varius, ullamcorper sed, sapien.
            </TextBlock>
        </Expander>
        <Expander Grid.Row="1" Grid.Column="1" 
      Margin="5" Padding="5" Header="Region Three" ExpandDirection="Left" 
              BorderThickness="1" BorderBrush="Black">
            <TextBlock TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        Nam mi sapien, viverra et, lacinia varius, ullamcorper sed, sapien.
            </TextBlock>
        </Expander>
    </Grid>
</Window>
MultiDirectionExpanders

   在WPF程序中使用Expander控件是非常合適的,因?yàn)閃PF鼓勵(lì)使用流式布局模型,,從而可以很方便地處理會(huì)大幅增大或縮小的內(nèi)容區(qū)域,。

  如果要使其他控件與Expander同步,可處理Expanded和Collapsed事件,。這些事件的名稱并未表明其含義,,這些事件正好在顯示或隱藏內(nèi)容前觸發(fā)。這兩個(gè)事件為實(shí)現(xiàn)延遲加載提供一種有用的方法,。例如,,如果創(chuàng)建Expander控件中的內(nèi)容非常耗時(shí),可能會(huì)直到要顯示時(shí)才檢索這些內(nèi)容,?;蛘呖赡芟M陲@示之前更新內(nèi)容。無(wú)論哪種情況,,都可以通過(guò)響應(yīng)Expanded事件來(lái)執(zhí)行相應(yīng)的工作,。

  通常,當(dāng)展開Expander時(shí),,它會(huì)增大以適應(yīng)所包含的內(nèi)容,。當(dāng)展開所有內(nèi)容后,如果窗口不足以顯示所有內(nèi)容,,這可能會(huì)帶來(lái)問(wèn)題,。下面是處理該問(wèn)題的集中策略:

  •   為窗口設(shè)置最小尺寸(使用MinWidth和MinHeight屬性),確保窗口在最小時(shí)也可以容納所有內(nèi)容,。
  •   設(shè)置窗口的SizeToContent屬性,,從而當(dāng)打開或關(guān)閉Expander控件時(shí),是窗口自動(dòng)擴(kuò)展為所需的大小,。通常將SizeToContent屬性設(shè)置為Manual,,但也可以使用Width或Height,以使窗口為了適應(yīng)所包含的內(nèi)容在任意方向上擴(kuò)展或收縮,。
  •   通過(guò)硬編碼Expander控件的Height和Widht屬性來(lái)限制其尺寸,,但當(dāng)Expander控件中的內(nèi)容太長(zhǎng)時(shí),可能會(huì)裁剪掉部分內(nèi)容,。
  •   使用ScrollViewer控件創(chuàng)建可滾動(dòng)的擴(kuò)展區(qū)域,。

  對(duì)于大多數(shù)情況,,這些技術(shù)都是非常簡(jiǎn)單的。唯一需要進(jìn)一步說(shuō)明的是如何組合使用Expander控件和ScrollViewer控件,,為讓這個(gè)方法湊效,,需要贏編碼ScrollViewer控件的尺寸。否則,,ScrollViewer控件會(huì)進(jìn)行擴(kuò)展以適應(yīng)它包含的內(nèi)容,。下面是一個(gè)示例:

<Window x:Class="Controls.ExpandableScrollableContent"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ExpandableScrollableContent" Height="300" Width="300">
    <StackPanel>
        <Expander Margin="5" Padding="5" Header="Region One">
        </Expander>
        <Expander Margin="5" Padding="5" Header="Region Two" >
            <ScrollViewer Height="50" >
                <TextBlock TextWrapping="Wrap">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam mi sapien, viverra et, lacinia varius, ullamcorper sed, sapien. Proin rutrum arcu vitae tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque libero dui, eleifend faucibus, auctor at, aliquet a, nulla. Nunc eros. Phasellus mauris nisi, eleifend nec, adipiscing nec, luctus nec, lacus. Aliquam justo metus, vestibulum non, accumsan id, hendrerit at, nibh. Praesent accumsan urna quis tortor. Proin erat libero, facilisis nec, rhoncus ut, malesuada ut, ipsum. Donec id nibh.
                </TextBlock>
            </ScrollViewer>
        </Expander>
        <Expander Margin="5" Padding="5" Header="Region Three" IsExpanded="True">
            <Button Padding="3">Hidden Button Two</Button>
        </Expander>
    </StackPanel>
</Window>
ExpandableScrollableContent

   如果有一個(gè)系統(tǒng),能讓Expander控件根據(jù)窗口的可用空間,,設(shè)置內(nèi)容區(qū)域的尺寸,,那將是非常好的。但這會(huì)明顯增加復(fù)雜度(例如,,當(dāng)Expander控件展開時(shí),,如果在多個(gè)區(qū)域共享空間)。Grid布局容器看起來(lái)像是潛在的解決方案,,但它不能和Expander控件很好地集成,。如果嘗試這樣的做的話,當(dāng)折疊Expander控件時(shí),,可能導(dǎo)致非常奇怪的行為,,不能正確地更新網(wǎng)格的行高,。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多