第5章 StackPanel和WrapPanel
WPF设计了面板panel,将空间和其它元素放在面板上,称之为Layout布局。
类的逻辑树:
1)检索元素的方法:
FrameworkElement的FindName方法,检索这个根节点下的所有元素:
Button btn = FindName("ButtonName") as Button;
使用面板的Children索引:
grid.Children[5]; //返回UIElement类型
grid.Children.IndexOf(btn); //返回btn元素所在的索引值,不存在则为-1
通过事件处理器,获取产生事件的对象,有两种方法:
Button btn = sender as Button; //使用第一个参数
Button btn = e.Source as Button; //使用第二个参数
以上代码对应于:
btn.Click += ButtonClick;
以及
void ButtonClick(Object sender, RoutedEventArgs e) { }
事件处理器的另一种情形,就是不使用的btn.Click += ButtonClick方式为每一个Button添加事件,而是代替使用:
AddHandler(Button.ClickEvent, new RoutedEventHandler(ButtonClick));
此时,sender就是Window对象,这就意味着Window会监视其所有的子元素的Click事件;而e.Source仍然是被点击的按钮对象。
当然,也可以让所有Button的承载器StackPanel来进行监视:
stack.AddHandler(Button.ClickEvent, new RoutedEventHandler(ButtonClick));
此时,sender就是StackPanel对象。
2)使用WrapPanel时,一般搭配ScrollViewer:
3)对于ScrollViewer的使用,这是一个复合控件,其滚动条端点的箭头,是一个RepeatButton,这个按钮上也有Click事件。所以在ScrollViewer的Click方法中,要判断e.Source的转型是否成功:
4)在有限的空间内放入很多元素,传统使用ScrollViewer,WPF建议使用ViewBox:
第6章 Stack和Wrap
1)GridSplitter
GridSplitter派生于Thumb,只能使用于Grid,而且要指定它所在的row和column位置(以及行和列的span):
GridSplitter可以和其它元素共享相同的单元格,这就存在被遮挡的问题——后出现的元素在前面,为此,需要设置margin,以避免重叠:
split.Margin = new Thickness(10);
一般会让GridSplitter跨越整行或整列,比较合理:
Grid.SetRowSpan(split, 3);
Grid.SetColumnSpan(split, 3);
一般把GridSplitter单独放在一个或一组单元格中
2)UniformGrid
类似于Grid,不同之处在于,UniformGrid所有行都等宽,所有列都等高,可以简单进行设置:
UniformGrid没有附属属性,来为其内部的元素指定位置,只能根据加入元素的顺序,依次增加索引值。
Unigrid.Children.Add(btn);
第7章
1)Polygon的使用:
Polygon poly = new Polygon();
poly.Points = new PointCollection();
新建立的Polygon对象,其Points属性为null。为此之后要添加一系列Point到其中:
poly.Points.Add(new Point(0, 0));
poly.Points.Add(new Point(1, 1));
另一种使用方法,直接添加Point数组: