超碰91资源站-超碰97豆花-超碰97人妻-超碰97人人干-超碰97人人香蕉-超碰97天天操-超碰97在线资源站-超碰97资源站共享-超碰97资源站总站-超碰aa在线91-超碰av操-超碰爱爱

半岛外围网上直营

WPF基礎(chǔ)到企業(yè)應(yīng)用系列6——布局全接觸

轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-02 15:46:55.000|閱讀 1119 次

概述:今天我們主要講了WPF布局系統(tǒng),對整個(gè)布局系統(tǒng)的原理、各個(gè)Panel的基本用法(分別用XAML和C#兩種方式實(shí)現(xiàn)同一個(gè)功能,便于大家學(xué)習(xí))以及自定義布局控件做了一些介紹,由于內(nèi)容太多,我只是力所能及的做一些相關(guān)的介紹和演示,所以只能給大家提供一個(gè)參考,如果大家想了解更多,還需要去看專門的教材,同時(shí)有些知識也只是個(gè)人的一些見解,所以大家只能將就著看了。

# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

一. 摘要

  首先很高興這個(gè)系列能得到大家的關(guān)注和支持,這段時(shí)間一直在研究Windows Azure,所以暫緩了更新,同時(shí)也本著想把它寫好、寧缺毋濫的精神,在速度上自然也就慢了下來,這篇文章拖拖拉拉也經(jīng)歷了十多天才發(fā)布出來(每天寫一點(diǎn)),不過請大家放心,這個(gè)系列一定會繼續(xù)寫下去。由于自己才疏學(xué)淺且是對這些技術(shù)的使用總結(jié)和心得體會,錯(cuò)誤之處在所難免,懷著技術(shù)交流的心態(tài),在這里發(fā)表出來,所以希望大家能夠多多指點(diǎn),這樣在使一部分人受益的同時(shí)也能糾正我的錯(cuò)誤觀點(diǎn),以便和各位共同提高。

  這篇文章主要是對WPF布局系統(tǒng)做一個(gè)較簡單的介紹,大家都知道:UI是做好一個(gè)軟件很重要的因素,如果沒有一個(gè)漂亮的UI,再怎么強(qiáng)大的功能也會顯得這個(gè)軟件很脆弱且沒有投資價(jià)值。本文以總分總的形式展開介紹:首先對WPF Panel做一個(gè)總體認(rèn)識、然后講解各Panel基本用法(分別用XAML和C#兩種方式實(shí)現(xiàn)同一個(gè)功能,便于大家學(xué)習(xí))、布局綜合應(yīng)用、自定義布局控件以及最后的總結(jié),希望對大家有所幫助。

二. 本文提綱

· 1.摘要

· 2.本文提綱

· 3.總體介紹

· 4.Canvas

· 5.StackPanel

· 6.WrapPanel

· 7.DockPanel

· 8.Grid

· 9.UniformGrid

· 10.ViewBox

· 11.Border

· 12.ScrollViewer

· 13.布局綜合應(yīng)用

· 14.自定義布局控件

· 15.本文總結(jié)

· 16.系列進(jìn)度

· 17.相關(guān)代碼

三. 總體介紹

  WPF的布局控件都在System.Windows.Controls.Panel這個(gè)基類下面,使用 Panel 元素在WPF應(yīng)用程序中放置和排列子對象。它具體包括哪些布局控件以及如何使用這些布局控件(分別用XAML和C#兩種方式實(shí)現(xiàn)同一個(gè)功能)、如何開發(fā)自定義的布局控件,也就是本文所要討論的范疇:

 

Panel具體繼承關(guān)系詳見下面類圖:

 

  如上圖,公共屬性太多了,就簡單介紹幾個(gè)常見的屬性:Margin是元素與其他元素的外邊距;Padding是指在本元素內(nèi)部的元素內(nèi)容與邊緣的距離;前面這兩個(gè)元素基本和ASP.NE中的Margin和Padding類似,只是定義大小的設(shè)置不同而已; FlowDirection屬性標(biāo)示元素的內(nèi)容顯示方向;Panel.ZIndex是相對于顯示屏的Z軸坐標(biāo),用于調(diào)整層疊元素的顯示先后;RenderTransform和LayoutTransform用來將縮放和旋轉(zhuǎn)的變換應(yīng)用到某個(gè)元素上。

  一個(gè)Panel 的呈現(xiàn)是測量和排列Children子元素、然后在屏幕上繪制它們的過程。所以在布局的過程中會經(jīng)過一系列的計(jì)算,那么Children 越多,執(zhí)行的計(jì)算次數(shù)就越多。如果不需要較為復(fù)雜的 Panel(如 Grid和自定義復(fù)雜的Panel),則可以使用構(gòu)造相對簡單的布局(如 Canvas、UniformGrid等),這種布局可帶來更好的性能。 如果有可能,我們應(yīng)盡量避免不必要地調(diào)用 UpdateLayout方法。

  每當(dāng)Panel內(nèi)的子元素改變其位置時(shí),布局系統(tǒng)就可能觸發(fā)一個(gè)新的處理過程。對此,了解哪些事件會調(diào)用布局系統(tǒng)就很重要,因?yàn)椴槐匾恼{(diào)用可能導(dǎo)致應(yīng)用程序性能變差。

  換句話說,布局是一個(gè)遞歸系統(tǒng),實(shí)現(xiàn)在屏幕上對元素進(jìn)行大小調(diào)整、定位和繪制,然后進(jìn)行呈現(xiàn)。具體如下圖,要實(shí)現(xiàn)控件0的布局,那么先要實(shí)現(xiàn)0的子控件01,02...的布局,要實(shí)現(xiàn)01的布局,那么得實(shí)現(xiàn)01的子控件001,002...的布局,如此循環(huán)直到子控件的布局完成后,再完成父控件的布局,最后遞歸回去直到遞歸結(jié)束,這樣整個(gè)布局過程就完成了.

 

  布局系統(tǒng)為 Children 集合的每個(gè)成員完成兩個(gè)處理過程:測量處理過程(Measure)和排列處理過程(Arrange)。每個(gè)子 Panel 均提供自己的 MeasureOverride 和 ArrangeOverride 方法,以實(shí)現(xiàn)自己特定的布局行為。

四. Canvas

  Canvas比較簡單,只是一個(gè)存儲元素的容器,它不會自動(dòng)調(diào)整內(nèi)部元素的排列及大小。不指定元素位置,元素將默認(rèn)顯示在畫布的左上方。Canvas的主要用途是用來畫圖。Canvas默認(rèn)不會自動(dòng)裁減超過自身范圍的內(nèi)容,即溢出的內(nèi)容會顯示在Canvas外面,這是因?yàn)槟J(rèn) ClipToBounds="False";我們可以通過設(shè)置ClipToBounds="True來裁剪多出的內(nèi)容。

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" x:Class=

"WPFLayoutDemo.CanvasDEMO"
x:Name="Window"
Title="CanvasDEMO"
WindowStartupLocation="CenterScreen"
Width="640" Height="480">
<Canvas Margin="0,0,0,0" Background="White">
<Rectangle Fill="Red"
Stroke="Azure"
Width="209"
Height="159"
Canvas.Left="310" Canvas.Top="181"/>
<Ellipse Fill="Azure"
Stroke="Green"
Width="258" Height="97"
Panel.ZIndex="1"
Canvas.Left="165" Canvas.Top="145"/>
</Canvas></Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class CanvasDEMOCodeBehind
{
public CanvasDEMOCodeBehind()
{
this.InitializeComponent();
Canvas canv = new Canvas();
//把canv添加為窗體的子控件
this.Content = canv;
canv.Margin = new Thickness(0, 0, 0, 0);
canv.Background = new SolidColorBrush(Colors.White); //Rectangle
Rectangle r = new Rectangle();
r.Fill = new SolidColorBrush(Colors.Red);
r.Stroke = new SolidColorBrush(Colors.Red);
r.Width = 145;
r.Height = 126;
r.SetValue(Canvas.LeftProperty, (double)124);
r.SetValue(Canvas.TopProperty, (double)122);
canv.Children.Add(r);
//Ellipse
Ellipse el = new Ellipse();
el.Fill = new SolidColorBrush(Colors.Azure);
el.Stroke = new SolidColorBrush(Colors.Azure);
el.Width = 121;
el.Height = 100;
el.SetValue(Canvas.ZIndexProperty, 1);
el.SetValue(Canvas.LeftProperty, (double)195);
el.SetValue(Canvas.TopProperty, (double)191);
canv.Children.Add(el);
}
}
}

五. StackPanel

  StackPanel就是將子元素按照堆棧的形式一一排列,通過設(shè)置面板的Orientation屬性設(shè)置了兩種排列方式:橫排(Horizontal默認(rèn)的)和豎排(Vertical)??v向的StackPanel默認(rèn)每個(gè)元素寬度與面板一樣寬,反之橫向亦然。如果包含的元素超過了面板空間,它只會截?cái)喽喑龅膬?nèi)容。 元素的Margin屬性用于使元素之間產(chǎn)生一定得間隔,當(dāng)元素空間大于其內(nèi)容的空間時(shí),剩余空間將由HorizontalAlignment和VerticalAlignment屬性來決定如何分配。其他屬性,大家可以看看如下類圖:

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" x:Class=

"WPFLayoutDemo.StackPanelDEMO"
x:Name="Window"
Title="StackPanelDEMO"
WindowStartupLocation="CenterScreen"
Width="640" Height="480">
<StackPanel Margin="0,0,0,0" Background="White" Orientation=

"Vertical"> <Button Content="Top of Stack"/>
<Button Content="Middle of Stack"/>
<Button Content="Bottom Of Stack"/>
</StackPanel>
</Window>]

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class StackPanelDEMOCodeBehind
{
public StackPanelDEMOCodeBehind()
{
this.InitializeComponent();

StackPanel sp = new StackPanel();
//把sp添加為窗體的子控件
this.Content = sp;
sp.Margin = new Thickness(0, 0, 0, 0);
sp.Background = new SolidColorBrush(Colors.White);
sp.Orientation = Orientation.Vertical;
//Button1
Button b1 = new Button();
b1.Content = "Top of Stack";
sp.Children.Add(b1);
//Button2
Button b2 = new Button();
b2.Content = "Middle of Stack";
sp.Children.Add(b2);
//Button3
Button b3 = new Button();
b3.Content = "Bottom of Stack";
sp.Children.Add(b3);
}
}
}

六. WrapPanel

  WrapPanel是一個(gè)非常簡單的面板,從左至右按順序位置定位子元素,如果排滿斷開至下一行。后續(xù)排序按照從上至下或從右至左的順序進(jìn)行。WrapPanel面板也提供了 Orientation屬性設(shè)置排列方式,這跟上面的StackPanel基本相似。不同的是WrapPanel會根據(jù)內(nèi)容自動(dòng)換行。

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" x:Class=

"WPFLayoutDemo.WrapPanelDEMO"
x:Name="Window"
Title="WrapPanelDEMO"
WindowStartupLocation="CenterScreen"
Width="640" Height="480">

<WrapPanel Margin="0,0,0,0" Background="White">

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60"/>

<Rectangle Margin="10,10,10,10" Fill =&quot;Azure" Width="60" Height="60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height=";60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60&quot; Height="60"/>

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60"/&gt;

<Rectangle Margin="10,10,10,10" Fill ="Azure" Width="60" Height="60&quot;/>

</WrapPanel>
</Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class WrapPanelDEMOCodeBehind
{
public WrapPanelDEMOCodeBehind()
{
this.InitializeComponent();
WrapPanel wp = new WrapPanel();
//把wp添加為窗體的子控件
this.Content = wp;
wp.Margin = new Thickness(0, 0, 0, 0);
wp.Background = new SolidColorBrush(Colors.White);
//遍歷增加Rectangles
Rectangle r;
for (int i = 0; i <= 10; i++)
{
r = new Rectangle();
r.Fill = new SolidColorBrush(Colors.Azure);
r.Margin = new Thickness(10, 10, 10, 10);
r.Width = 60;
r.Height = 60;
wp.Children.Add(r);
}
}
}
}

七. DockPanel

  DockPanel定義一個(gè)區(qū)域,在此區(qū)域中,您可以使子元素通過描點(diǎn)的形式排列。停靠面板其實(shí)就是在WinForm類似于Dock屬性的元素。DockPanel會對每個(gè)子元素進(jìn)行排序,并??吭诿姘宓囊粋?cè),多個(gè)??吭谕瑐?cè)的元素則按順序排序,最后一個(gè)元素填充這個(gè)Panel(這個(gè)需要設(shè)置LastChildFill屬性為 True)。對于在DockPanel中的元素的??繉傩钥梢酝ㄟ^Panel.Dock的附加屬性來設(shè)置.

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" x:Class=

"WPFLayoutDemo.DockPanelDEMO"
x:Name="Window"
Title="DockPanelDEMO"
WindowStartupLocation="CenterScreen"
Width="640" Height="480">
<DockPanel Width="Auto" Height="Auto" LastChildFill="True">
<Rectangle Fill="Beige" Stroke="BlanchedAlmond" Height="180" DockPanel.Dock="Top"/>
<Rectangle Fill="Azure" Stroke="Orange" />
</DockPanel></Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class DockPanelDEMOCodeBehind
{
public DockPanelDEMOCodeBehind()
{
this.InitializeComponent();
DockPanel dp = new DockPanel();
dp.LastChildFill = true;
dp.Width = Double.NaN;
//這個(gè)就相當(dāng)于在XAML中設(shè)置Width="Auto"
dp.Height = Double.NaN;
//這個(gè)就相當(dāng)于在XAML中設(shè)置Height="Auto"
//把dp添加為窗體的子控件
this.Content = dp;
//添加Rectangles
Rectangle rTop = new Rectangle();
rTop.Fill = new SolidColorBrush(Colors.BlanchedAlmond); rTop.Stroke = new SolidColorBrush(Colors.BlanchedAlmond);
rTop.Height = 180;
dp.Children.Add(rTop);
rTop.SetValue(DockPanel.DockProperty,Dock.Top);
Rectangle rFill = new Rectangle();
rFill.Fill = new SolidColorBrush(Colors.Azure);
rFill.Stroke = new SolidColorBrush(Colors.Azure);
dp.Children.Add(rFill);
}
}
}

八. Grid

  Grid和其他各個(gè)Panel比較起來,功能最多也最為復(fù)雜,它由<Grid.ColumnDefinitions>列元素集和<Grid.RowDefinitions>行元素集合兩種元素組成。而放置在Grid面板中的控件元素都必須顯示采用附加屬性語法定義其放置所在的行和列,否則元素均默認(rèn)放置在第0行第0列。由于Grid的組成并非簡單的添加屬性標(biāo)記來區(qū)分行列,這也使得用戶在實(shí)際應(yīng)用中可以具體到某一單元格中,所以布局起來就很精細(xì)了。

Grid的列寬與行高可采用固定、自動(dòng)、按比列三種方式定義

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="300" />
</Grid.ColumnDefinitions></Grid>

第一種,固定長度——寬度不夠,會裁剪,不好用。單位pixel。
第二種,自動(dòng)長度——自動(dòng)匹配列中最長元素的寬度。
第三種,比例長度——*表示占用剩余的全部寬度;兩行都是*,將平分剩余寬度;像上面的一個(gè)2*,一個(gè)*,表示前者2/3寬度。

跨越多行和多列

<Rectangle Fill="Silver" Grid.Column="1" Grid.ColumnSpan="3&quot;/>

使用Grid.ColumnSpan和Grid.RowSpan附加屬性可以讓相互間隔的行列合并,所以元素也可以跨越多個(gè)單元格。

使用GridSplit分割

<GridSplitter Height="6" VerticalAlignment="Stretch" 
HorizontalAlignment="Stretch"     
           Grid.Row="2" Grid.Column="2"></GridSplitter>

使用GridSplit控件結(jié)合Grid控件實(shí)現(xiàn)類似于WinForm中SplitContainer的功能,這個(gè)大家在WinForm當(dāng)中經(jīng)常用到,我們也不多做介紹。

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" x:Class="WPFLayoutDemo.GridDEMO"
x:Name="Window"
Title="GridDEMO"
WindowStartupLocation="CenterScreen"
Width="640" Height="480">
<Grid Width="Auto" Height="Auto" >
<Grid.ColumnDefinitions>

<ColumnDefinition Width="139"/>
<ColumnDefinition Width="184*"/>
<ColumnDefinition Width="45*" />
<ColumnDefinition Width="250*"/>
</Grid.ColumnDefinitions>
<Rectangle Fill="Azure" Grid.ColumnSpan="2" Margin="0,0,21,0" /> <Rectangle Fill="Silver" Grid.Column="1" Grid.ColumnSpan="3"/>
</Grid>
</Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class GridDEMOCodeBehind
{
public GridDEMOCodeBehind()
{
this.InitializeComponent();
Grid grid = new Grid();
grid.Width = Double.NaN;
//這個(gè)就相當(dāng)于在XAML中設(shè)置Width="Auto"
grid.Height = Double.NaN;
//這個(gè)就相當(dāng)于在XAML中設(shè)置Height="Auto"
//把grid添加為窗體的子控件
this.Content = grid;
//列一
ColumnDefinition cd1 = new ColumnDefinition();
cd1.Width = new GridLength(139);
grid.ColumnDefinitions.Add(cd1);
//列二
ColumnDefinition cd2 = new ColumnDefinition();
cd2.Width = new GridLength(1, GridUnitType.Star); grid.ColumnDefinitions.Add(cd2);
//列三
ColumnDefinition cd3 = new ColumnDefinition();
cd3.Width = new GridLength(2, GridUnitType.Star); grid.ColumnDefinitions.Add(cd3);
//把單元格添加到grid中

Rectangle r1c1 = new Rectangle();
r1c1.Fill = new SolidColorBrush(Colors.Azure);
r1c1.SetValue(Grid.ColumnProperty, 0);
r1c1.SetValue(Grid.RowProperty, 0);
grid.Children.Add(r1c1);
Rectangle r1c23 = new Rectangle();
r1c23.Fill = new SolidColorBrush(Colors.Silver);
r1c23.SetValue(Grid.ColumnProperty, 1);
r1c23.SetValue(Grid.ColumnSpanProperty, 2);
grid.Children.Add(r1c23);
}
}
}

九 UniformGrid

  介紹了前面的Grid,接下來的這個(gè)UniformGrid 就太簡單了,均布網(wǎng)格的是Grid的簡化版本,每個(gè)單元格的大小相同,不用在定義行列集合。均布網(wǎng)格每個(gè)單元格只能容納一個(gè)元素,將自動(dòng)按照定義在其內(nèi)部的元素個(gè)數(shù),自動(dòng)創(chuàng)建行列,并通常保持相同的行列數(shù)。

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window x:Class="WPFLayoutDemo.UniformGridDEMO" xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
Title="UniformGridDEMO" Height="300" Width="300">
<UniformGrid Columns="2" Rows="2" Name="uniformGrid1" >
<Rectangle Margin="10,10,10,10" Fill ="Gray"/>
<Rectangle Margin="10,10,10,10" Fill ="Gray" />
<Rectangle Margin="10,10,10,10" Fill ="Gray" />
<Rectangle Margin="10,10,10,10" Fill ="Gray" />
</UniformGrid>
</Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class UniformGridDEMOCodeBehind : Window
{
public UniformGridDEMOCodeBehind()
{
InitializeComponent();
UniformGrid wp = new UniformGrid();
//把wp添加為窗體的子控件
this.Content = wp;

wp.Margin = new Thickness(0, 0, 0, 0);
wp.Background = new SolidColorBrush(Colors.White);
//遍歷增加Rectangles
Rectangle r;
for (int i = 0; i <= 10; i++)
{
r = new Rectangle();
r.Fill = new SolidColorBrush(Colors.Gray);
r.Margin = new Thickness(10, 10, 10, 10);
wp.Children.Add(r);
}
}
}
}

十. ViewBox

  ViewBox這個(gè)控件通常和其他控件結(jié)合起來使用,是WPF中非常有用的控制。定義一個(gè)內(nèi)容容器,該容器可拉伸和縮放單個(gè)子元素以填滿可用空間。一個(gè) Viewbox 只能具有一個(gè) Child。如果添加一個(gè)附加 Child,會導(dǎo)致一個(gè)運(yùn)行時(shí) ArgumentException錯(cuò)誤。我們用得最多的首先是Stretch屬性,然后是StrctchDirection屬性,關(guān)于這兩個(gè)元素,大家可以運(yùn)行我們的代碼,然后改變設(shè)置就可以看到效果。

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window x:Class="WPFLayoutDemo.ViewBoxDemo" xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
Title="ViewBoxDemo" Height="342" Width="535">
<Viewbox Stretch="Uniform">
<Button Content="Hello,Knights Warrior" />
</Viewbox>
</Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class ViewBoxDEMOBehind : Window
{
public ViewBoxDEMOBehind()
{
this.InitializeComponent();
Viewbox vb = new Viewbox();
vb.Stretch = Stretch.Uniform ;
//把vb添加為窗體的子控件
this.Content = vb;
//Button1

Button b1 = new Button();
b1.Content = "Hello,Knights Warrior";
vb.Child=b1;
}
}
}

十一. Border

  Border 是一個(gè)裝飾的控件,此控件繪制邊框及背景,在 Border 中只能有一個(gè)子控件(這個(gè)子控件又可以包含多個(gè)子控件)。Border 的幾個(gè)重要屬性:Background:用用一個(gè) Brush 對象來繪制背景 ;BorderBrush:用一個(gè)Brush 對象來繪制邊框 ;BorderThickness:此屬性設(shè)置 Border 邊框的大??;CornerRadius:此屬性設(shè)置 Border 的每一個(gè)角圓的半徑;Padding:此r屬性設(shè)置 Border 里的內(nèi)容與邊框的之間的間隔。

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window x:Class="WPFLayoutDemo.BorderDEMO" xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
Title="BorderDEMO" Height="300" Width="300">
<Border
BorderThickness="5"
BorderBrush="Green"
CornerRadius="10"
Background="LightGray"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="270" Height="250">

<Canvas Background="LightCyan" >
<Rectangle
Canvas.Left="30" Canvas.Top="20"
Height="200" Width="200"
Stroke="Black" StrokeThickness="10" Fill="Red" />
</Canvas>
</Border>
</Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class BorderDEMOCodeBehind : Window
{
public BorderDEMOCodeBehind()
{
InitializeComponent();
Border border = new Border();
border.Background = new SolidColorBrush(Colors.LightGray); border.BorderThickness = new Thickness(5);
border.BorderBrush = new SolidColorBrush(Colors.Green); border.CornerRadius = new CornerRadius(15);
border.Width = 270;
border.Height = 250;
Canvas cnvas = new Canvas();
Rectangle rect = new Rectangle();
rect.Width = 200;
rect.Height = 200;
rect.Fill = new SolidColorBrush(Colors.Black);
rect.StrokeThickness = 10d;
cnvas.Children.Add(rect);
border.Child = cnvas;
this.Content = border;
}
}
}
 

十二. ScrollViewer

  通常用戶界面中的內(nèi)容比計(jì)算機(jī)屏幕的顯示區(qū)域大,大出的部分就會破壞原有的布局。利用 ScrollViewer 控件可以方便地使應(yīng)用程序中的內(nèi)容具備滾動(dòng)功能。這樣大出的部分就可以正常顯示出來了。常用屬性、事件和繼承關(guān)系見下面類圖:

 

要實(shí)現(xiàn)的效果如下圖(用XAML和C#實(shí)現(xiàn)同一效果):

 

XAML代碼實(shí)現(xiàn):

<Window x:Class="WPFLayoutDemo.ScrollViewerDEMO" xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
Title="ScrollViewerDEMO" Height="300" Width="300">
<Grid>
<ScrollViewer>
<Rectangle Width="500" Height="500" Fill="Gray"></Rectangle> </ScrollViewer>
</Grid>
</Window>

C#代碼實(shí)現(xiàn):

namespace WPFLayoutDemo
{
public partial class ScrollViewerDEMOCodeBehind : Window
{
public ScrollViewerDEMOCodeBehind()
{
InitializeComponent();
ScrollViewer myScrollViewer = new ScrollViewer(); myScrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; Rectangle myRectangle = new Rectangle();

myRectangle.Fill = Brushes.Gray;
myRectangle.Width = 500;
myRectangle.Height = 500;
myScrollViewer.Content = myRectangle;
this.Content = myScrollViewer;
}
}
}

十三.布局綜合應(yīng)用

  前面通過十多個(gè)小節(jié)講了一些常用Panel的基本用法,那我們這里就簡單做一個(gè)綜合的小例子,通過這個(gè)例子,旨在鞏固前面的內(nèi)容,也可以當(dāng)做一個(gè)舉一反三的過程。要實(shí)現(xiàn)的效果如下圖:

 

XAML代碼實(shí)現(xiàn):

<Window x:Class="WPFLayoutDemo.PuttingItAllTogether" xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" WindowStartupLocation="CenterScreen"
Title="布局綜合運(yùn)用" Width="640" Height="480" >
<DockPanel Width="Auto" Height="Auto" LastChildFill="True">
<!--Top Menu Area-->
<Menu Width="Auto" Height="20" Background="LightGray" DockPanel.Dock="Top"> <!-- File Menu -->
<MenuItem Header="文件">
<MenuItem Header="保存"/>
<Separator/>

<MenuItem Header="退出"/>
</MenuItem>
<!-- About Menu -->
<MenuItem Header="幫助">
<MenuItem Header="關(guān)于本產(chǎn)品"/>
</MenuItem>
</Menu>
<!--State -->
<StackPanel Width="Auto" Height="31" Background="LightGray" Orientation="Horizontal" DockPanel.Dock="Bottom">
<Label Width="155" Height="23" Content="狀態(tài)欄" FontFamily="Arial" FontSize="10"/>
</StackPanel>
<!--Left-->
<StackPanel Width="136" Height="Auto" Background="Gray">
<Button Margin="5,5,5,5" Width="Auto" Height="26" Content="導(dǎo)航欄"/> <Button Width="126" Height="26" Content="導(dǎo)航欄" Margin="5,5,5,5"/> <Button Width="126" Height="26" Content="導(dǎo)航欄" Margin="5,5,5,5"/> </StackPanel>
<!--Right-->
<Grid Width="Auto" Height="Auto" Background="White"> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<Rectangle Fill="Gray" Margin="10,10,10,10" Grid.Row="0"; Grid.Column=&quot;0"/>

<Rectangle Fill="Gray" Margin="10,10,10,10" Grid.Row="0" Grid.Column="1"/>

<Rectangle Fill="Gray" Margin="10,10,10,10" Grid.Row=&quot;1" Grid.Column="0"/>

<Rectangle Fill="Gray" Margin="10,10,10,10" Grid.Row="1" Grid.Column="1"/>

</Grid>
</DockPanel>

  其實(shí)用熟練上面的各個(gè)布局控件以后,你會發(fā)現(xiàn)布局UI是一件非常容易的事,遇到一個(gè)新的UI,你會發(fā)現(xiàn)任意一個(gè)Panel都可以實(shí)現(xiàn)你的需求。當(dāng)然對于較復(fù)雜且對要求很高的UI,我們也會自定義一些Panel,在下面我們就簡單介紹一下自定義布局控件。

十四.自定義布局控件

  講到自定義布局控件,我們必須得先談一下在WPF中自定義控件,在WPF自定義控件你可以選擇下圖的一些基類作為繼承對象,你也可以繼承自已有的一些控件,這個(gè)就看你的需要了。其實(shí)開發(fā)WPF自定義控件和開發(fā)WinForm、ASP.NET自定義控件基本類似,只是要注意一些特別的地方,比如依賴屬性的處理、路由事件、視覺樹和邏輯樹等等。

 

  于今天只是講如何開發(fā)一個(gè)自定義的Panel,所以在清楚了基類的前提下,首先得了解它有哪些屬性和事件,這樣就可以確定哪些是不需要單獨(dú)寫、哪些是需要override。下圖就是Panel和基類FrameworkElement 的類圖:

 

  在清楚了上面這張圖以后,我們就可以著手開始寫了,我們知道布局系統(tǒng)的工作原理是先測量后排列,測量就是確定面板需要多大空間,排列則是定義其面板內(nèi)子元素的排列規(guī)則。自定義面板要繼承自Panel類并重寫MeasureOverride和rrangeOverride方法即可,如下便是一個(gè)簡單的自定義Panel:

namespace WPFLayoutDemo
{
public class PlotPanel : Panel
{
public PlotPanel()
: base()
{
}
//重寫默認(rèn)的Measure方法
protected override Size MeasureOverride(Size availableSize)
{
Size panelDesiredSize = new Size();
foreach (UIElement child in InternalChildren)
{
child.Measure(availableSize);
panelDesiredSize = child.DesiredSize;
}
return panelDesiredSize;
}
//重寫默認(rèn)的Arrange方法
protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement child in InternalChildren)
{
double x = 50;
double y = 50;
child.Arrange(new Rect(new Point(x, y), child.DesiredSize));
}
return finalSize;
}
}
}
 

  控件的最終大小和位置是由該控件和父控件共同完成的,父控件會先給子控件提供可用空間(availableSize),子控件再反饋給父控件一個(gè)自己的期望值(DesiredSize),父控件最后根據(jù)自己所擁有的空間大小與子控件的期望值分配一定的空間給子控件并返回自己的大小.那么這個(gè)過程就是通過MeasureOverride 和ArrangeOverride這兩個(gè)方法來完成(注意父控件的availableSize是減去Margin、padding等的值)。

  本來想自己開發(fā)一個(gè)較復(fù)雜的Panel控件放上來,但一搜網(wǎng)絡(luò),發(fā)現(xiàn)已經(jīng)有很多很好的Panel控件,所以在這里我也不寫那么多了,大家可以研究一下這些控件,我也研究了幾個(gè),覺得最好理解且最美觀的當(dāng)屬&ldquo;FishEyePanel & FanPanel, Paul Tallett, codeproject ”,大家可以根據(jù)鏈接過去看一下,Paul Tallett講解得非常的細(xì)致。

  • TreeMapPanel, Kevin Moore (see bag-o-tricks for code)
  • AnimatingTilePanel, Kevin Moore (see bag-o-tricks for code)
  • Disposing Virtualizing Stack Panel, Aaron, WiredPrairie.us
  • TimeLinePanel, Rob Zelt, robzelt.com (with credit to Robert Ingebretsen and Lauren Lavoie)
  • Chart and Lens Panel by John Stewien (code available?)
  • DiagonalPanel
  • FishEyePanel & FanPanel, Paul Tallett, codeproject
  • RadiaPanel & ItemsRadialPanel, Rhett log (Henry Hahn posted a Radial panel in 2005, but I'm not sure if it runs or not?)
  • DisclaimerPanel, Chaz
  • SpanningStackPanel, Nick Theusen
  • PlotPanel, Windows SDK Sample
  • CollapsiblePanel, Thomas Lebrun
  • CornerStacker, Nick Thuesen
  • StickyPanel, Unni, Blend PM
  • ItemSkimmingPanel, Pavan Podila

順便也鏈接兩幅圖:

 

講到這里,我們也順便提一下寫WPF自定義控件的幾個(gè)步驟,以后在講到這一節(jié)的時(shí)候會詳細(xì)講解:

  • 首先你得清楚你的自定義控件是干什么用的(能解決什么問題)?公用到什么程度(其他項(xiàng)目也可以用、本項(xiàng)目用、項(xiàng)目當(dāng)中一個(gè)模塊用、只有一個(gè)地方用)?是繼承已有的控件還是從頭寫?對設(shè)計(jì)時(shí)是否支持?樣式和模板的定義等。
  • 確定好了上面的步驟后,我們就可以建立項(xiàng)目的結(jié)構(gòu),類和資源文件等該放在什么位置也就在這一步確定。
  • 選擇要繼承的基類(UIElement、FrameworkElement 、Control 、ContentControl 、HeaderedContentControl 、ItemsControl 、Selector 、RangeBase還是已有的一些控件)。
  • 重寫默認(rèn)的樣式和新建一些樣式并附默認(rèn)值。
  • 由于WPF的屬性基本都是依賴屬性,所以我們也要新建一些依賴屬性。
  • 邏輯樹和視覺樹的一些處理以及事件等。

十五.本文總結(jié)

  今天我們主要講了WPF布局系統(tǒng),對整個(gè)布局系統(tǒng)的原理、各個(gè)Panel的基本用法(分別用XAML和C#兩種方式實(shí)現(xiàn)同一個(gè)功能,便于大家學(xué)習(xí))以及自定義布局控件做了一些介紹,由于內(nèi)容太多,我只是力所能及的做一些相關(guān)的介紹和演示,所以只能給大家提供一個(gè)參考,如果大家想了解更多,還需要去看專門的教材,同時(shí)有些知識也只是個(gè)人的一些見解,所以大家只能將就著看了。寫篇文章也是懷著技術(shù)交流的心態(tài)發(fā)布出來,由于是自己對這些技術(shù)的使用總結(jié)和心得體會,錯(cuò)誤之處在所難免,所以希望大家能夠多多指點(diǎn),這樣也能糾正我的錯(cuò)誤觀點(diǎn),以便和各位共同提高!


標(biāo)簽:

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn

文章轉(zhuǎn)載自:博客轉(zhuǎn)載自圣殿騎士

為你推薦

  • 推薦視頻
  • 推薦活動(dòng)
  • 推薦產(chǎn)品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
利記足球官網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 真人boyu·博魚滾球網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 最大網(wǎng)上PM娛樂城盤口(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 正規(guī)雷火競技官方買球(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 雷火競技權(quán)威十大網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) boyu·博魚信譽(yù)足球官網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 權(quán)威188BET足球網(wǎng)(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 正規(guī)188BET足球大全(官方)網(wǎng)站/網(wǎng)頁版登錄入口/手機(jī)版登錄入口-最新版(已更新) 国产精品一级av在线播放 | 国产超清无码视频 | 国产精品欧美亚洲大片在线观看 | 国产日本精品在线观看 | 国产成人欧美日韩在线电影 | 国产精品麻豆天美精品久久 | 国产经典三级视频在线观看 | 91直播在线观看免费 | 国产极品粉嫩馒头一线天 | 精品人妻一区二区三区夜夜嗨 | 国产精品亚洲v毛片一区二区三区 | 国产美女黄性色av | 国产成人久久精品激情91 | 91大神在线| 成人片在线 | 国产女人喷潮在线观看视频 | 国产一区二区三区视频精品 | 国产麻豆精品免 | 激情内射亚州一区二区三区爱妻 | av收藏夹电影完整版 | 国产超级乱婬视频免费 | 97色伦图片9 | 91狠狠色丁香婷婷综合久久 | 国产成人精品一区二区 | 99精品精品综合久久精品 | 精品国内自产拍在线视频 | 91亚洲中文天堂 | av天堂电影网 | 国产美女精品aⅴ在线 | 91国语精品自产拍在线观看一 | 国产精品高潮久久久久久无码 | 国产成人精品久久亚洲高清不卡 | 丰满多毛少妇做爰 | 国产一区欧美日韩另类 | 国产高清在线观看av片 | 高潮娇喘抽搐喷水潮喷视频网站 | 91po国产在线精品免费观看 | 国产精品欧美一区不卡亚洲 | a级无码久久久一区 | 国产成人综合日韩精品无 | 911精品国产 | 国产夜生活高清手机在线 | 国产成人一区二区在线观看 | 国精产品自线在拍在线精品 | 精品视频在线观自拍自拍 | 丰满爆乳无码一区二区三区 | 国产精品三级在线观看 | 国产大片黄在线观看私人影 | av中文无码乱人伦在线观看 | 国产成人中文字幕在线 | 精品无码av无码免费专区 | 国产精品欧美亚洲日韩国产 | 成人精品无码 | 国产成人麻豆精品午夜福利在线 | 国产在线精品无码二区 | 国产高清视频免费最新在线 | 国产福利无码一区色费 | 国产av高清怡春院ww8 | 国产精品毛片va一 | 国产日韩欧美一区二区东京 | 国产精品成人无码久久久 | 国产熟人av一二三区 | 国产精品入口麻豆 | 成人精品一区二区91毛片不卡 | 国产自在现偷国产精品国产日韩 | 国产无码午夜不卡 | 国产美女精品久久久久久久免费 | 加勒比久久综合 | 国产精品午夜自在在线精品 | 国产成人精品无码a区在线观看 | 成人免费在线观看视频 | 激情欧美在线 | 国产精品丝袜一区二区三区在线 | 国产91小视频在线观看 | 国产一区二区三区高清视频在线 | 国产亚洲视频在线观看网址 | 国产福利秒拍一区二区在线观看 | 91女人18毛片水多国产 | 91麻豆国产福利精品 | 99久久国产综合精品swag | 国产av一区二区三区日韩 | 国产成人综综合视频 | 国产精品中文字幕免费观看 | 国产欧美亚洲日韩另类a | 国产在线观看自拍日本 | 18成禁人看免费无遮挡动态图 | 国产在线无码视频一区 | 国产成人三级视频在 | 国产成人高清在线观看播放 | aⅴ一区二区三区 | 精品国产av无码久久久不卡 | 国产女人喷潮视频 | 国产在线无码精品无码 | 国内盗摄视频一区二区 | 国产午夜福利在线不卡视频 | 91久久国产综合精品女同国语 | 国产精品高潮久久久久 | 国产午夜激无码av毛片不 | 国产日韩aⅴ免费无码一区二区 | 国产精品多人p | av片不卡在线观看 | 99精品一级欧美片免费播放 | 91制片厂果冻星空传媒战争 | 国产精品一区二区亚洲精品 | 国产粗话肉麻对白在线播放 | 丰满人妻系列无码专区 | 精品亚洲国产成人av在线 | 国产猛烈高潮 | 国产成人无码aⅴ片在线观看 | 极品国产一区二区三区 | 91国语露脸精品高清国产 | 国产国拍亚洲精品永久软件 | 精品国内自产拍在线播放观看 | 国偷自产av一区二区三区吞精 | 国产精品观看无码不卡视频 | 国产精品无码制服 | 18处破外女出血在线 | 国产欧美日韩视频免费61794 | 成人无码视频在线观看 | 精品无码视频一区二区三区 | 成人午夜福利片 | 国产高颜值露脸在 | 国产成人高清精品免费观看 | 国产美女视频一区二区二三区 | 国产精品爆乳在线播放 | 18禁美女黄网站色大片免费 | 91成人爽a毛片一区二区动漫 | 精品国内在视频线 | 国产欧美久久久精品影色欲 | 国产一级片内射视 | 国产在线自在拍91精品 | 极品美女一级毛片 | 国产盗摄精品一区 | 国产美女精品三级在线观看 | www国产精品内射老熟女 | 国产白丝jk捆绑束缚调教视频 | 2025露脸国产偷人在视频 | 国产成人综合美国十次 | 国产成人精品久久亚洲高清不卡 | 国产精品尹人在线观看 | 国产一级一级毛片真人视频 | 国产欧美日韩灭亚洲精品 | 国产日韩精品久久久一区二区 | 国产91白丝在线播放 | 国产精品一区二区三区色噜噜 | 狠狠爱无码一区二区三区 | 国产浮力草草影院ccyy | 国产丰满老熟女厨房乱 | 国产一区二区在线亚洲中文在线 | 国产一区二区三区在 | 国产精品一区二区日韩av在线 | 丰满少妇高潮惨叫久久久一 | 加勒比免费无码网址 | 国产精品日韩亚洲一区二区 | 国产麻豆精品免费视频 | 精品国产一区二区三区av麻 | 国产原创在线观看播放 | 精品国产日韩欧美一区二区 | 91成人免费在线视频 | 国产精品一在线观看 | 国产福利91精品一区二区三区 | 国产精品拍国产拍拍偷 | 成人无码电影 | 韩国三级丰满少妇高潮 | 国产性爱在线播放 | 国产精品熟女视频一区二区 | 国产午夜精品在人线播放 | 国产免费无码一区 | 高潮流白浆潮喷在线播 | 99久久精品午夜一区 | 国产精品无码首页自拍 | 精品动漫一区二区无码视频 | 国产精品免费av片在线观看 | 国产成人av在线播放不卡影院 | 91福利精品 | 丰满少妇人妻无码专区 | 国产欧美日韩综合在线一区二区 | 91精品国产aⅴ一区二区 | 国模少妇无码一区二区三区 | 动漫av纯肉无码av电影网 | 国产精品一级爱 | 91蜜桃精品国产自产在线 | 国产精品午夜无码av体验区 | av永久无码精品桃花岛知道 | 成人精品国产区在线观看 | 成年夜99九九久久夜观欧美 | 精品国产又粗又大又黄又硬 | 成年午夜一级毛片视频 | 国产中文字字幕乱码在线电影 | 国产精品啪啪视频一区二区 | 东京热久久精品 | 2025亚洲国产精品无码 | 国产成人精品a视频免费福利 | 国产精品天干天 | 国产97人人超 | 国产成人av大片在线观看 | 高清无码在线观看流畅不卡 | 国产中文字幕免费不卡 | 国产欧美日韩综合在线一区二区 | 国产熟睡乱子伦午夜视频网 | 国产喷水aⅴ | 国产午夜男女爽爽爽爽爽视频 | av在线亚洲男人的天堂 | 国产综合精品九九久久一区二区 | 18禁无遮挡羞羞污污污污网站 | 国产aⅴ无码久久丝袜美腿 国产aⅴ无码专区 | 国产高清视频免费最新在线 | 国产重口调教在线观看 | 91人妻碰碰视频免费上线 | 国产精品欧美在线观看 | 91视频免费看平台安全吗 | 国内精品伊人久久久av高清影 | 18禁纯肉高黄无码动漫在线 | 高清无码在线观看h片 | 国产制服丝袜在线一区 | 成人国内精品久久久久影院 | 国产精品麻豆一区二区三区v视界 | 国产精品一区二区尿失禁 | 成人精品一区久久久 | 国产色系视频在线观看 | 国产精品亚洲欧美大片在线 | 成人日韩欧美国产黄片视频 | 国产午夜电影在线观看不卡 | 国产欧美国日产在线视频 | 国产精品日韩久久肉色丝袜交足 | 国产女人喷浆抽搐高潮视频 | av免费 | 国产精品亚洲一区二区三区正片 | 国产精品涩 | 极品熟妇大蝴蝶20p 极品熟女少妇av免费久久自慰 | 国产麻豆9l精品三级站 | 国产精品亚洲一区二区在线观 | 99亚洲国产精品色一区二区三 | 国产成人无码a区播放视频 国产成人无码a区电影 | 国产精品初高中精品免费观看 | 国产女主播一二三区丝袜美腿 | 91精品国产麻豆福利在线电影 | 国产麻豆精品精东影业av网站 | av免费黄色网址 | 国产欧美va天 | 国产av无码片毛片一级流奶水 | 3d新金瓶玥菲无删减完整版 | 国产精品一级av在线播放 | 国产精品无码一二三区免费 | 国产一区亚洲一区 | 东京热一区二区沙河无 | 国产精品日韩欧美一区2区3区 | 国外免费人妖网视频在线观 | 国产一区二区精品久久 | 国产精品原创午夜宅男视频 | 国产美女跪下吃大j8视频 | 囯产精品宾馆在线精品酒店 | 国产高清视频在线一区二区三区 | 91在线无码精品秘入口九 | 国产在线精品观看 | 3d动漫精品专区久久电影 | a级无遮挡超级高清 | 东京热无码人妻精品一区二区 | 国产中文内射一区二区三区在线 | 国产一区二区三区精品91 | 国产精品亚洲一区二区在线观 | 国产一区二区三区高清视频在线 | 91久久精品在这里色伊人64 | 2025国产精品久久精品 | 国产日韩一区二区三免费高清 | av片在线观看网站免费的 | 国产一区二区三区精品观看 | 成人亚洲性情网站w | 91精品尤物在线观看 | 精品人妻av无码系列 | av免费不卡国产在线观看 | av中文字幕一区少妇 | 精品熟妇av免费久久久久 | 99久久伊人精 | 国产高清在线一区免费 | 国产精品主播在线三区 | 国产精品青草国产一区二区 | 精品国产乱子伦一区二区三区 | 韩国级床戏大尺度在线观看 | 国产午夜精品1区2区3福利 | 2025国产精品最新在线 | 成人区免费aⅴ片在线观看 成人区人妻 | 精品人妻大屁股白浆无码p 精品人妻大屁股白浆无码久久 | 成人午夜精品久久久久久久小说 | 国产一区二区在线不卡 | av无码激情一线天 | 国产一区在线视频 | 国产成人午夜精 | aⅴ亚洲| 91精品人妻一区一区三区 | 国产精品三级一区二区三区 | 国产精品人人做人人爽 | 精品少妇人妻一区二区黑料社区 | 国产高清爆乳乱码女大 | 国产精品一区二区免费不卡 | 3d动漫精品啪啪一区二区免费 | 高潮胡言乱语对白刺激国产 | 精品国产亚洲人成在线观看 | 国产成人精品久久久久精品 | 国产丝袜肉丝视频在线 | 国产成人综合伊人日韩 | 成人欧美s视频在线观看 | 国产自产v一区二区三区c | 国产成人免费影片 | 国产一在线精 | 国产精品亚洲日韩欧美在线观看 | 国产人妻精品一区二区三区不卡 | 国产无码日韩 | 成人动漫第一页 | 国产欧美日韩综合 | 国产女人爽的流水毛片 | 国产精品嫩草国产精品嫩草 | 91精品国产福利尤物免费 | 国产三级短视频在线观看 | 精品无码一区二区三区av影院 | 91精品无码中文字幕在线 | 国产熟女乱淫一区 | 丰满人妻久久中文字幕免费 | 高潮又爽又无遮挡又免费 | 91在线视频国产 | 国产精品成人久久电影 | 国产成人精品a视频免费福利 | 国产va免费精品观看 | 国产97色在线中文 | 国产在线无码制服丝袜无码知名国产 | 91九色国产社区在线观看 | 国产女同无遮 | 岛国在线观看无码不卡 | 白嫩美女在线啪视频观看 | av无码精品一区二区三区四区 | av午夜精品一区 | 韩国美女精品一区二区三区 | 国产无码理论视频网 | 国产真实露脸多 | 国产91丝袜 | 成人国产综合一区二区在 | 国产激情va在线影片播放 | 2025最新久久久视精品爱 | 国产精品国产高清国产专区720p | 69热视频在线观看免费自拍 | 精品亚洲成a人片在线观看 精品亚洲成a人片在线观看少妇 | 国产精品另类激情久久久免费 | 东京热久久精 | 成人免费播放视频 | 国产精品午夜久久久久久99热 | 国产精品久久久精品app | 国产成人在线视频 | 国产精品视频第一页 | 成人精品一区二区 | 国产福利爱福利微拍视频 | av色蜜桃一区二区三区 | 国产午夜福利影院 | 97午夜理论片在线影院 | 国产成人无码免费看片软 | 91免费国产在线观看蜜桃 | 国产成人av电影在线观看第页 | 国产av无码专区亚洲av手机麻豆 | 国产av一区二区精品久 | 国产91精品人妻互换在线 | 国产精品一线二线三线区别解析 | 国产av无遮挡喷水白浆桃花 | 成人综合国内精品久久久久久影院 | 国产熟睡乱子伦视频在线观看 | 福利一区在线观看 | 国产麻豆精品高清在线播放 | 国产精品伦理在线 | 国产精品原创巨作av免费 | 国产在线观看成 | 91精品福利麻 | 国产一区二区三区精品网站 | 国产成人无码一区二区动漫 | 国产精品免费aⅴ片在线观看 | 97人妻免费 | 91精品全国免费观看青青 | 国产精品一一老牛影视视 | 超大乳抖乳露双乳呻吟电影 | 国产成人av在线免播放观看新 | 国产午夜精品一区二区不卡 | 福利无码精品一区二区在线观看 | 国产精品无码中出在线播出 | 国产a久久精品一区二区三区 | 成人午夜福利a片在线观看 成人午夜福利电影 | 国产精品美女久久久久网站9 | 国产丝袜一区 | 国产草草影院一区二区三区 | 精品亚洲av无码一区二区 | 国产综合久久久久影院 | 国产午夜精品一区二区三区 | 国产免费真实喷潮视频 | 国产真实夫妇交换视频 | av综合影院 | 高清无码第一区亚洲欧洲国 | 国产精品高清一区二区人妖 | 精品国产aⅴ无码一区二区 精品国产aⅴ一区二区三区 | 国产精品一级 | 国产欧美日韩中文字幕第一页 | 国产女主播喷水视频 | 91在线无精精品秘一区二区 | 国产成人久久精品二区三区小说 | 91国语精品自产拍在线观看一 | 精品三级av在线免费观 | 91成人18禁 | 国产精品后入内射日 | 97人妻精品一区二区三区 | 精品一精品国产一级毛片 | 国产精品国产自产拍高清av | 国产日韩一区二区三区高清视频 | 国产精品乱码在线观看 | 国内精品一区视频在线播放 | 国产精品自拍小视频 | 国产精品色在线免费 | 国内国精产品一二三区传媒 | 精品人妻av综合一区二区 | 国产成人网站免费一区二区 | 高潮喷水在线观看免费 | 国产成人无码a区在线观看视频免费 | 国自产精品手机在线视频香蕉 | 国产精品偷伦费观看 | 国产午夜福利免费不卡在线观看 | 国产欧美日韩亚洲 | 91精选国产免费高清 | 国产午夜精品爆乳美女蜜臂av | 国产精品成aⅴ人片在线观看 | 精品少妇人妻一区二区黑料社 | 99久久久无码欧洲精品免费 | 国产午夜福利电影在线 | 91精品在线免费视频 | 国内精品一级毛片免费看 | 潮喷大喷水系列无码网站国外 | 国色天香久久精品国产一区 | 国产午夜精品美女短视频 | 国产区视频在线网站 | 国产人妖的免 | 国产a一级毛片精品精品乱码 | 国产白丝精品久久av网站 | 国产高清在线观看一区二区三区 | 国产末成年av一区二区三区 | 91日韩天堂一区二区二区 | 国产三级自拍亚洲色欲色欲 | 国产午夜三级一区二区 | 91精品人妻一区一区三区 | 国产毛片女人高潮叫声 | 91精品国产兔费观看久久 | 97人妻无码免费视频一区 | 2025国产精品极品在线 | 国产无码午夜不卡 | 国产黄色视频网站 | 国产精品对白交换 | 国产大波视频在线播放 | 国产成人综合亚洲无码中字 | 国产精品亚洲αv天堂无码 国产精品亚洲产品一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 成人无码国产 | 国产爆乳无码视频在线观看3 | 国精无码欧精品 | 91在线免费| 动漫精品一区二区三区视频 | 国内粉嫩小视频在线观看网站 | 国产成人高清精品免费 | 国产sm重味一区二 | 1000部精品久久久久久 | 国产精品秘麻豆果冻传媒在线 | 成人区人妻精品一区二区三区 | 91黄色视频免费在线观看 | 国产在线精品一区二区高清 | 国产片婬乱一级毛片调 | 91av手机在线观看 | 国产一区二区三区在线2025 | 国产高清在线精品一区在线 | 国产精品一区第二页 | 东京热aⅴ无码一区二区 | 国产在线精品一区在线观看 | 国产精品区免费视频 | 精品国产一区二区三区国产馆杂枝 | 精品毛片免费观看 | 福利一区视频 | 不卡国产在线看h | 国产成人欧美视频在线观看 | 国产综合福利视频电影 | 国产在线视频欧美一区二区三区 | 国产成人av综合亚洲色欲 | 精品无码秘人妻一区二区 | 国产中文字幕乱码免在线观看 | 国产成人a大片大片在线播放 | 国产精品国产自线在线观看 | 精品久久国产综合婷婷五月 | 潮喷失禁大喷水 | 国产午夜福利影院在线观看 | 福利一区在线观看 | 国产97精品一区二区三区四区 | 国产内射精品视频 | 国产精品熟女一区二区 | 激情人妻无码又大又粗蜜桃av | 成人无码潮喷视频 | 99久久精品免费看国产99 | av秋霞电影在线播 | 国产在视频一区二区三区吞精 | 国产日韩欧美一区二区三区 | 国产欧美日本一区二区三区免费 | 国产成人aa午夜视频 | 国产综合成人观 | 精品久久久无码人妻中文 | 黑人巨大精品欧美一区二区.. | 国产精品欧美亚洲日韩国产 | 国产高跟制服剧情在线 | 国产美女一区二区三区 | av日韩中文地址 | 国产精彩视频一区二区三区 | 国产在线视频主播区 | 国产精品国内自产拍在线播放 | 国产精品夜色一区二区三区 | 国产午夜高潮熟女精品 | 动漫成人无码精品一区二区三区 | av色伊人久久综合一区二区 | 成年人樱桃app下载安装 | 国内一本到不卡在线观看 | 91精品国产乱码久久久久 | 国产a级黄色毛片 | 国产麻豆精品 | 国产精品欧美久久久天天影视 | 精品无码国产一区二区三区51 | 国产精品无码一本二本三本色 | 国产经典三级av在线播放 | 国产人视频成 | 国产成人精品三 | 国产精品成人免费精品自在线 | 91精品少妇高潮一区二区 | 白嫩美女在线啪视频观看 | 精品久久久久久中文字幕无码软件 | 国产成年无码av片 | 精品深夜av无码一区二区老年 | 国产91久久九九免费精品无码 | 国产av无码一级麻 | 国模超大尺度私拍 | 国产精品一区二区国模私拍 | 国产精品v片在线观 | 国产重口老太和两个小伙另类 | 国产午夜激无码色本v毛片 国产午夜精华2025在线 | 91成人爽a毛片一区二区动漫 | 成人亚洲网站在线 | 国产尤物精品一区二区三区 | 国产精品边做奶水狂喷 | 精品国产鲁一鲁一区二区三区 | 国产午夜福利不卡在线观看视频 | 国产精品一区二区久久精品涩爱 | 动漫精品一区二区三区在线 | 丰满人妻被公侵犯日本 | 国产超碰人人做人人爱ⅴa 国产超碰人人做人人爱电影 | 国产成人av在线播放欲色 | 国产情趣免费视频在线观看 | 国产免费内射又粗又爽密桃视频 | 高清中文无码久久 | 国产午夜精品久久久久九九电影 | 国产99re精彩视 | 国产真人无码作爱免 | 丰满爆乳无码专区一区 | 国产免费无遮挡美女 | 按摩一级国产毛片按摩 | 国产午夜无码区在线观看 | 国产午夜毛片v区一区二区三区 | 91在线无码精品秘入口九色 | 国产极品粉嫩福利 | 国产福利最新手机在线观看 | 成人亚洲a片v一区二区三区蜜月 | 精品亚洲国产成av人片不卡无码 | 国产三级无码在线观看 | 国产成人人人爆出白浆 | 国产熟女一区二区三区五月婷 | 国产经典一区 | av专区一区二区三区 | 黑人最新av在线 | 国产真实高中生在线在线观看 | 成人精品一区二区三区 | 成人无码网www在线观看 | 国自产拍偷拍精品 | 国产欧美日韩视频在线不卡 | 国产高潮流白浆喷水免费网站 | 国产精品白丝jk白祙喷水视频 | 99久久久无码国产精品性 | 精品国产免费人成在线观看 | 成人av高清不卡在线 | av无码精品久久久久精品免费 | 国产精品夜色视频一区二区三区 | 国产麻豆蜜桃色精 | 国产中文在线 | 国产亚洲日韩在线人成 | 国产午夜成人av片 | a级毛片无码久久精品免费 a级毛片无码免费久久 | 国产欧美日韩视频一区二区三区 | 高清无码在线观看越南专区 | 国产在线高清伦免费理视频 | 黄色av影院在线观看 | 国产白嫩精品 | 国产av无码专区亚洲精品网站 | 丰满人妻被公侵犯完整版 | 精品人妻一区二区三区四区在线 | 精品熟女少妇av免 | 国产经典三级在线播放 | 国产欧美久久一区二区 | 国产精品无码精品久久久 | 国产观看精品一区二区三区 | 国产福利午夜九二网免费 | 国产一级毛片av不卡尤物 | 护士人妻hd中文字幕 | 国产福利精品一 | 国产综合变态自虐重口另类 | 国产亚洲欧美日韩亚洲中文色 | 成人日韩欧美国产黄片视频 | 国产无码少妇影视 | 国产精品亚洲片在线观看不 | 国产三级精品电影视频 | 国产精品亚洲欧美高清亚洲综合欧 | 69国产精品成 | av鲁丝一区二区三区 | 国产成人欧美亚洲日韩电影 | 国产白浆精品 | 国产在线精品国自产拍影院同性 | 成人在线观看二区 | 国产a级黄色毛片 | 国产主播剧情演绎在线观看 | 911国产在线观看无码专区 | 国产精品麻豆一区二区三区 | 国产另类欧美激情 | 岛国毛片在线观看 | 丰满大爆乳波霸奶 | 国产做a爱免费视频在线观看 | 国产精品视频系列专区 | 国产白丝jk捆绑束缚调教视频 | 精品美女网站在线观看av污 | 国产麻豆精品久久久 | 91精品国产91久久综合 | 精品熟人妻一区二区三区四区不卡 | 成人精品一区二区三区 | 国产精品区网红主 | 国产精品日韩一区二区 | av激情亚洲男人的天堂国语 | 国产精品三级网站 | 91福利国产在线观 | 精品高潮呻吟久久av无码 | 国产麻豆精品乱码一区 | 91久久久精品无码国产一区 | 精品无码国产免费 | 国产精品三级美女网站全黄真人 | 国产综合精品无码久久 | 激情欧美视频一区二区三区 | 国产成人3p视 | 国产精品果冻麻豆精东天美 | www夜片内射视频在观看视频 | 2025午夜福利网站入 | 国产黄频在线观看高清免费 | 国产一区二区精品久久91 | 精品人妻一二三区 | 国产偷窥女洗浴在线观看一区 | 国产aⅴ一区二区三区片 | 国语自产偷拍 | 1024国产欧美日韩精品 | 国产精品无码一区二区三区电影 | 精品91自产拍在线观看二区 | 成人涩涩视频免费观看 | 国产成人无码精品久久久露脸 | 国产成人最新毛片基地 | 极品尤物一区二区三区小说 | 精品亚洲欧美日韩久久 | 国产天堂网一区二区三区 | 国产自偷亚洲精品页65页 | 国产在线观看午夜视频 | 国产麻豆免费观 | 国产三级小视频在线播放完整 | 97精品国产综合久久 | 国产熟女自拍av | 国产大片大全免费看软件下 | 韩国三级中文电影在线观看 | 国产精品涩 | 国产精品无码久久人妻无码影院 | 波多野结衣永久免费视频 | 国产av一区二区三区不卡 | 国产91久久久久久久免费 | 精品日本一区二区三区在 | 国产精品拍在 | 岛国大片在线一区二区三区 | 国产在线精品无码 | 丰满巨臀大屁股bbw 丰满老熟妇aaaa片 | 成人午夜精品无码区 | 国产精品吹潮在线观看中文 | 东京热毛片无码dvd一二三区 | 国产成人精品999在 国产成人精品999在线观看 | 国产成人精品aaa | 国产萌白酱喷水在线播放尤物 | 国产二区三区毛片 | 国产黄色a级| 国产一区二区免费播放 | 国产成人免费永久播放视频平台 | 国产午夜精品一区二区三区 | 国产无码一区二区二区 | 国产福利事件门视频种子 | 国产午夜福利精品理论片在线播放 | 国产精品va在线观看浪潮 | 国产精品一区无码免费视频 | 精品国产一区二区三区 | 精品福利一区二区三区免费视频 | 黑人巨大精品欧美一区二区.. | 国产福利一区二区在线观看 | 国产美女裸舞一区二区 | 国产福利姬喷水福利在线观看 | 国产福利在线视频大二 | 国产激情视频趣趣在线 | 国产福利姬喷水福利在线观看 | 精品69视频一区二区三区 | 成人午夜精品久久久久久久小说 | 国产亚洲欧美另类第一页 | 99久久精品免费看国产漫画 | 高潮国产白浆抽搐福利日本 | 国产精品爽爽va在线观看网站 | 成人黄页网站免费观看大全 | 国产午夜精品理论 | 丰满肥臀风间由美系列 | 国产精品免费看 | 国产精品啪啪视频一区二区 | 99久久久无码国产精品秋霞网 | 国产精品日韩高清秒播日韩国产欧美 | av免费无码不卡一区二区 | 国产精品va在线播放 | 精品视频一区二区三三区四区 | 国产爆乳美女娇喘呻 | 国产熟女精品视频大全 | 国产精品视频视频久久 | 成人国产精品一区二区网站 | 18禁成人黄网站免费观看 | 精品无码久久91毛片视频 | 精品无码一区二区三区在线 | 国产成人精品久久在线 | 国产欧美va欧美va香蕉在 | 北岛玲日韩精品一区二区三区 | 国产毛片高清 | 国产精品女同一区二区在线观看 | 国产大片一级在线 | 91av在线国 | 国产精品专区第一页 | 国产午夜成人免费看片 | 国产精品免费aⅴ片在线观看 | 国产区精品 | 国产人妻精品久久久久野外 | 国产精品国产三级国产专区 | 黄色视频亚洲一区二区无码真爽 | 国产高清av在线播放 | 97午夜理论片影院在线播放 | 国语对白自拍 | 国产91久久精品一区二区 | 91精彩视频惊喜不断 | 国产午夜精品久久久久婷婷 | 成人精品第一区 | 国精产品一品二 | 国产mv日韩一区二区三区 | 国产伊人明星在线观看 | 国产激情视频一区二区三区 | 国产中文欧美高清字幕 | 国产人妖性一区二区 | 国产欧美日产高清欧美一区二区 | 99久久国产宗和精品1上映 | 国产成人无码精品久久二区三区 | 国产蜜臀av在线一区尤物 | 成人做受视频试看60秒 | 91无码人妻精 | 国产亚洲欧美日韩精品一区二区 | 97人妻无码免费视频一区 | 国产美女无套粉嫩白浆在线 | aⅴ无码一级a片在线视频免费 | 91香蕉国产亚洲一区二区三区 | 成人精品久久久 | 国产欧美日韩另类在线 | 国产69精品久久久久久妇女 | 国产精品自拍四区 | 国产精品免费av片在线观看 | 国产成人无码小说在线观看 | 国产成人精品大尺度在线观看 | 国产福利小电影视福利在线 | 国产精品中文字幕在线 | 精品国产亚洲人成在线 | 国产偷窥女洗浴在线 | 国产嫩草视频在线观看 | 国产超薄黑色丝袜在线观看 | 国产一区二区久久婷婷 | 国产高潮又爽又刺激的视频 | 国产白嫩精品 | 国产精品国产自线在线观看 | 成人在线91 | 2025无码国产在线专区 | 国产aaa午夜激情 | 成人欧美在线观看 | 精品精品国产高清a级毛片8 | 99精品国产福久久久久久蜜 | 成人午夜视频在线观 | 变态调教一区二区三区男同 | 国产精品三级国产精品高 | 国产福利不卡一区二区三区 | 国产一区二区黄色传媒 | 国产精品九九 | 国产精品无码av不卡 | 国产美女大量吞 |