Application=Code+Markup 读书笔记 57章

5 StackPanelWrapPanel

WPF设计了面板panel,将空间和其它元素放在面板上,称之为Layout布局。

类的逻辑树:

       FrameworkElement
              Panel(抽象类)
                     Canvas
                     DockPanel
                     Grid
                     StackPanel
                     UniformGrid
                     WrapPanel

1)检索元素的方法:

FrameworkElementFindName方法,检索这个根节点下的所有元素:

            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

            ScrollViewer scroll = new ScrollViewer();
            Content 
= scroll;
            WrapPanel wrap 
= new WrapPanel();
            scroll.Content 
= wrap;

3)对于ScrollViewer的使用,这是一个复合控件,其滚动条端点的箭头,是一个RepeatButton,这个按钮上也有Click事件。所以在ScrollViewerClick方法中,要判断e.Source的转型是否成功:

            Button btn = e.Source as Button;

            
if (btn != null)
            

                
//do something
            }

4)在有限的空间内放入很多元素,传统使用ScrollViewerWPF建议使用ViewBox

            Viewbox view = new Viewbox();
            Content 
= view;
            view.Child 
= grid;

第6 StackWrap

1GridSplitter

GridSplitter派生于Thumb,只能使用于Grid,而且要指定它所在的rowcolumn位置(以及行和列的span)

            GridSplitter split = new GridSplitter();
            split.Width 
= 6;
            grid.Children.Add(split);
            Grid.SetColumn(split, 
2);
            Grid.SetRow(split, 
1);

GridSplitter可以和其它元素共享相同的单元格,这就存在被遮挡的问题——后出现的元素在前面,为此,需要设置margin,以避免重叠:

            split.Margin = new Thickness(10);

一般会让GridSplitter跨越整行或整列,比较合理:

            Grid.SetRowSpan(split, 3);

            Grid.SetColumnSpan(split, 3);

一般把GridSplitter单独放在一个或一组单元格中

2UniformGrid

类似于Grid,不同之处在于,UniformGrid所有行都等宽,所有列都等高,可以简单进行设置:

            UniformGrid unigrid = new UniformGrid();
            unigrid.Rows 
= 2;
            unigrid.Columns 
= 3;

UniformGrid没有附属属性,来为其内部的元素指定位置,只能根据加入元素的顺序,依次增加索引值。

               Unigrid.Children.Add(btn);

7

1Polygon的使用:

            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数组:

            poly.Points = new PointCollection(new Point[]
            
{
                
new Point(0,0),
                
new Point(1,1)
            }
);
原文地址:https://www.cnblogs.com/Jax/p/1189041.html