今天我们来说说WPF的布局。我们知道WinForm的布局主要是采用基于坐标的方式,当窗口内容发生变化时,里面的控件不会随之动态调整,这就造成了一个很不好的用户体验。而WPF为了避免这个缺点,采用了基于流的这种灵活的布局方式(WinForm在.net 2.0中也增加了对flow-based的支持)。工欲善其事,必先利其器。首先,我们来看看WPF的布局控件主要有哪些。然后,了解下主要用于构成复杂控件的原始控件。最后说说关于内容溢出的处理办法。
WPF常用的布局控件主要有这么几个:Grid、StackPanel、Canvas、DockPanel、WrapPanel,它们都继承自Panel抽象类。
1.1Grid
Grid应该算是WPF中最常用的布局控件了。新建一个窗口可看到Grid是作为其默认的布局控件的。它的效果类似html中的Table,只不过在外观上Grid默认是没有边框的。我们可以在Visual Studio中的Xaml设计器上快速的创建表格,如下图所示:
通过Xaml设计器设计,会自动为我们生成布局代码,值都是精确的,我们可以适当微调。当然,直接手写Xaml也可以达到同样的效果,下面我们来用C#代码来实现这样的布局:
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 LayoutDemo { /// <summary> /// GridWnd1.xaml 的交互逻辑 /// </summary> public partial class GridWnd1 : Window { public GridWnd1() { InitializeComponent(); Grid grid = new Grid(); //添加行 RowDefinition row1 = new RowDefinition(); row1.Height = new GridLength(1, GridUnitType.Star); //添加Button Button button1 = new Button(); button1.Content = "Button1"; button1.Width = 70; button1.Height = 30; //button1.SetValue(Grid.RowProperty, 0); Grid.SetRow(button1, 0); RowDefinition row2 = new RowDefinition(); row2.Height = new GridLength(1, GridUnitType.Star); RowDefinition row3 = new RowDefinition(); row3.Height = new GridLength(1, GridUnitType.Star); grid.RowDefinitions.Add(row1); grid.RowDefinitions.Add(row2); grid.RowDefinitions.Add(row3); //添加列 ColumnDefinition col1 = new ColumnDefinition(); col1.Width = new GridLength(1, GridUnitType.Star); ColumnDefinition col2 = new ColumnDefinition(); col2.Width = new GridLength(1, GridUnitType.Star); ColumnDefinition col3 = new ColumnDefinition(); col3.Width = new GridLength(1, GridUnitType.Star); grid.ColumnDefinitions.Add(col1); grid.ColumnDefinitions.Add(col2); grid.ColumnDefinitions.Add(col3); grid.Background = Brushes.LightBlue; grid.Children.Add(button1); this.Content = grid; } } }