WPF布局-面板类(二)

DockPanel,停靠模板,DockPanel默认的停靠方式是水平,而且最后一个放入的元素,默认是填充模式。 在WinForm中,是经过设置Dock属性,停靠控件的,不过这个属性要优先于控件的Height和Width属性,即设置Dock后,会改变Height和Width的值。但在WPF中,标签没有了Dock属性,若是标签放在DockPanel中,这个标签就中增长一个属性“DockPanel.Dock”,它是控制标签自己在DockPanel中的呈现方式,有四个值“Top,Bootom,Left,Right”不过这个属性设置后,不会更改标签的Height和Width的值。ide

<DockPanel Margin="12,94,65,49" Background="Green" >布局

<Rectangle DockPanel.Dock="Top" Height="52" Name="rectangle1" Fill="#FFD13E3E"/>性能

<Rectangle DockPanel.Dock="Left" Fill="#FF22D53E" Name="rectangle2" ;88" />测试

<Rectangle Fill="#FFD5AC22" Name="rectangle3" />this

</DockPanel>orm

效果以下:get

红色向顶端对齐,因此DockPanel.Dock=”Top”,绿色居左DockPanel.Dock=”Left”,×××是填充,因此不用设置这个属性,因此Width和Height都是Auto,Auto是默认值。it

StackPanel,是一个放置横平坚直标签的面板,能够经过设置面板的Orientation属性来设置StackPanel子标签的放置,Vertical为纵向,Horizontal为横向。io

例如:模板

<StackPanel Orientation="Horizontal" Height="82" VerticalAlignment="Top" Margin="20,12,334,0">

<Rectangle ;20" Name="rectangle4" Fill="#FFD13E3E"/>

<Rectangle ;20" Fill="#FF22D53E" Name="rectangle5" />

<Rectangle ;20" Fill="#FFD5AC22" Name="rectangle6" />

</StackPanel>

<StackPanel Margin="20,100,334,119" Orientation="Vertical">

<Rectangle Height="20" Name="rectangle1" Fill="#FFD13E3E"/>

<Rectangle Height="20" Fill="#FF22D53E" Name="rectangle2" />

<Rectangle Height="20" Fill="#FFD5AC22" Name="rectangle3" />

</StackPanel>

WrapPanel是默认从左到右顺序排放控件的面板,回在超到面板宽度后自动排放到下一行。

<WrapPanel Margin="0,0,266,133" Orientation="Horizontal" FlowDirection="LeftToRight">

<Rectangle Height="50" ;50" Name="rectangle1" Fill="#FFD13E3E"/>

<Rectangle Height="50" ;50" Fill="#FF22D53E" Name="rectangle2" />

<Rectangle Height="50" ;50" Fill="#FFD5AC22" Name="rectangle3" />

<Rectangle Height="50" ;50" Name="rectangle4" Fill="#FF011570"/>

<Rectangle Height="50" ;50" Fill="#FFD022D5" Name="rectangle5" />

<Rectangle Height="50" ;50" Fill="#FFB0D522" Name="rectangle6" />

</WrapPanel>

以下图

VirtualizingStackPanel是一个比较特别的面板,MSDN是这样撒描术的“标准布局系统能够建立项容器并为每一个与列表控件关联的项计算布局。“虚拟化”是指一种技术,经过该技术,可根据屏幕上所显示的项来从大量数据项中生成用户界面 (UI) 元素的子集。”彷佛很难懂,意思就是在给一些列表控件加载子项时,VirtualizingStackPanel 布局子项。例如:

ListBox通常状况下是垂直的,咱们能够经过修改VirtualizingStackPanel的Orientation=”Horizontal”可改变排布,代码以下:

<ListBox Height="167" Name="personList" ;120">

<ListBox.ItemsPanel>

<ItemsPanelTemplate>

<VirtualizingStackPanel Orientation="Horizontal">

</VirtualizingStackPanel>

</ItemsPanelTemplate>

</ListBox.ItemsPanel>

<ListBox.ItemTemplate>

<DataTemplate>

<Label Content="{Binding Path=control}"></Label>

</DataTemplate>

</ListBox.ItemTemplate>

</ListBox>

<Label Height="30" Name="Count_Lab" Background="#FFCCF8F8" />

<Button Height="23" Name="Fill_But" ;75" Click="Fill_But_Click">填充</Button>

后台代码:

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

}

private void Fill_But_Click(object sender, RoutedEventArgs e)

{

List<PanelConstrols> cons = new List<PanelConstrols>();

DateTime dt1 = DateTime.Now;

for (int i = 0; i < 5; i++)

{

Label label = new Label();

label.Content = "Label"+i.ToString ();

label.Height =30;

PanelConstrols pc = new PanelConstrols();

pc.control = label;

cons.Add(pc);

}

this.personList.ItemsSource =cons;

DateTime dt2 = DateTime.Now;

TimeSpan ts = dt2 - dt1;

Count_Lab.Content ="用时"+ ts.Milliseconds+"毫秒";

}

}

class PanelConstrols

{

public Control control

{

get;

set;

}

}

会发现,ListBox中的控件会横向显示。可能有人想,不用VirtualizingStackPanel也能达到目的呀,是的,这都是通用的,但VirtualizingStackPanel提供了一种虚拟技术,来快加载显示的列表子项,数据量大时,效果更明显,下面来作个测试:

在xaml中, &lt;ItemsPanelTemplate>中若是是VirtualizingStackPanel时,点击按钮,会计算出用时,几回平均值为45ms左右,若是把VirtualizingStackPanel换成StackPanel,平均时间为135ms左右,能够见用VirtualizingStackPanel在性能上提高了不少。

相关文章
相关标签/搜索