我们将在本章讲解面板Stack和Wrap,首先我们来看下他们的继承结构:

   1:  UIElement
   2:     FrameworkElement
   3:        Panel(abstract)
   4:          Canvas
   5:             DockPanel
   6:                Grid
   7:                   StackPanel
   8:                      UniformGrid
   9:                         WrapPanel

Panel定义了Children property,用来存储Child Element,Children property的类型是UIElementCollection

,也就是UIelement对象的collection,因此面板的对象可以是Image、Shape、TextBlock和Control以及其他的面板对象等。

我们看一段程序,改程序将在面板上建立10个按钮:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Windows;
   6:  using System.Windows.Controls;
   7:  using System.Windows.Data;
   8:  using System.Windows.Documents;
   9:  using System.Windows.Input;
  10:  using System.Windows.Media;
  11:  using System.Windows.Media.Imaging;
  12:  using System.Windows.Navigation;
  13:  using System.Windows.Shapes;
  14:   
  15:  namespace WPF_StackAndWrap
  16:  {
  17:      /// <summary>
  18:      /// MainWindow.xaml 的交互逻辑
  19:      /// </summary>
  20:      public partial class MainWindow : Window
  21:      {
  22:          public MainWindow()
  23:          {
  24:              InitializeComponent();
  25:              Loaded += WindowOnLoaded;
  26:          }
  27:   
  28:          private void WindowOnLoaded(object sender, RoutedEventArgs e)
  29:          {
  30:              TenButton();
  31:          }
  32:   
  33:          private void TenButton()
  34:          {
  35:              Title = "This is Stack";
  36:              StackPanel panel = new StackPanel();
  37:              Content = panel;
  38:   
  39:              Random rand = new Random();
  40:              for (int i = 0; i < 10; i++)
  41:              {
  42:                  Button btn = new Button();
  43:                  btn.Name = ((char)('A' + i)).ToString();
  44:                  btn.Content = "Button " + btn.Name + " Click Me";
  45:                  btn.FontSize += rand.Next(10);
  46:                  panel.Children.Add(btn);
  47:   
  48:                  btn.Click += (sender, e) =>
  49:                  {
  50:                      MessageBox.Show((sender as Button).Content.ToString());
  51:                  };
  52:              }
  53:          }
  54:      }
  55:  }

当然,你可以给StackPanel加上背景色,确认StackPanel到底有多大:

   1:  panel.Background = Brushes.Aquamarine;

或者,改变子元素堆叠的方向,用Orientation property:

   1:  panel.Orientation = Orientation.Horizontal;

如果你需要选择一个元素,如果这个元素在XAML文件里进行了定义,那么你可以通过如下的方式获取:

   1:  object obj = FindName("Name");

这个方法调用的是window的FindName(),但是它会递归查询元素,当然,你还可以通过Children这个UIElementCollection元素来获取节点:

   1:  UIElement ele = panel.Children[0];

或者,如果el是panel的一个子节点,那么:

   1:  int index = panel.Children.IndexOf(el);

如果找到就返回相应的index,没有就返回-1;

除了在循环中绑定btn.Click事件意外,我们还可以通过以下方式来绑定事件:

   1:  AddHandler(Button.ClickEvent,new RoutedEventHandler(ButtonOnClick));
   2:   
   3:  private void ButtonOnClick(object sender, RoutedEventArgs e)
   4:  {
   5:        MessageBox.Show(((Button)e.Source).Name);
   6:  }

在这里需要注意,ButtonOnClick这个方法里的sender指向的是window,而e.Source属性指向的是事件的具体触发者。

如果你需要显示的内容太多,一屏幕显示不了的时候,你就需要一个滚动条了,在这里ScrollViewer类就可以帮助你完成这个需求,ScrollViewer类和window和ButtonBase类一样,同样继承自ContentControl,我们下面的例子,将创建50个按钮来演示ScrollViewer:

   1:  private void ScrollViewerTest()
   2:  {
   3:      ScrollViewer scroll = new ScrollViewer();
   4:      Content = scroll;
   5:   
   6:      StackPanel stack = new StackPanel();
   7:      scroll.Content = stack;
   8:      Random rand =new Random();
   9:   
  10:      for (int i = 0; i < 50; i++)
  11:      {
  12:          Button btn = new Button();
  13:          btn.Content = ((char)('A' + i)).ToString();
  14:          btn.FontSize += rand.Next(10);
  15:   
  16:          stack.Children.Add(btn);
  17:      }
  18:  }

你可以尝试着把scroll.VerticalScrollBarVisibility设置成为VerticalScrollBarVisibility.auto:

   1:  scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;

这样竖向的滚动条就会在需要的时候显示。

昨天接了个长电话,所以博文没有写完,今天一定补上。

转载于:https://www.cnblogs.com/freedoom/archive/2012/10/31/2747450.html

来自window Presentation Foundation Program Design的读书笔记 第五篇 上相关推荐

  1. 来自Window Presentation Foundation Program Design的读书笔记 (第四篇 上)

    本篇讲解Button and Other Controls 在wpf中,控件一词比早期的window from更具有意义,在早期的windows from中,屏幕上的一切都是控件,但是在wpf中这个词 ...

  2. 来自window Presentation Foundation Program Design的读书笔记 第五篇下

    我们来看下一个例子,这个例子将在一个button中放置一个stackpanel,然后在放置多个对象: 1: private void StackInButton() 2: { 3: Button bt ...

  3. 来自Window Presentation Foundation Program Design的读书笔记 (第四篇 下)

    我们将一个tooltip控件绑定到button上,以便鼠标经过button时,可以显示提示信息, 1: private void ToolTipTest() 2: { 3: Button btn = ...

  4. Head First Design Pattern 读书笔记(4) 工厂模式

    2019独角兽企业重金招聘Python工程师标准>>> Head First Design Pattern 读书笔记(4) Factory Pattern 工厂模式 ##Factor ...

  5. 《教练型管理者》读书笔记-第3篇 【教练流程】

    <教练型管理者>读书笔记-第1篇 [教练原则] <教练型管理者>读书笔记-第2篇 [教练技能] 第3 篇 教练流程 教练定义:"教练是基于对话技术,赋能个人达成绩效目 ...

  6. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

  7. 《教练型管理者》读书笔记-第2篇 【教练技能】

    <教练型管理者>读书笔记-第1篇 [教练原则] 第2 篇 教练技能 教练原则是通过教练的行为体现的.就像学习武功一样,心法虽然重要,但要落地就需要依靠扎实的基本功,这就是教练的核心技术. ...

  8. 《Python从入门到实践》读书笔记——第五章 if语句

    <Python从入门到实践>读书笔记--第五章 if语句 1. 一个简单示例 cars = ['audi', 'bwm', 'subaru', 'toyota']for car in ca ...

  9. 读书笔记(五)--公司绝不会告诉你的50大秘密

    读书笔记--第5篇--<公司绝不会告诉你的50大秘密> 0.法律解救不了您. 1.聪明过头并非明智之举. 2.年龄和性别歧视是活生生的现实. 3.公司并非畅所欲言的好地方. 4.如果你与老 ...

最新文章

  1. python错误提示“TabError: inconsistent use of tabs and spaces in indentation”
  2. 再见丑陋的 Swagger,这个API神器界面更炫酷,逼格更高,体验更好!
  3. 记2018年技术人一次短暂的创业
  4. centos6.8升级python3.5.2
  5. dblink查询_分库数据如何查询统计
  6. 编写python扩展模块_《深度剖析CPython解释器》27. 使用Python/C API编写扩展模块:编写扩展模块的整体流程...
  7. 知识蒸馏 | 知识回顾
  8. mysql默认dba_DBA 基本常识 - 安装完 MySQL 后必须调整的 10 项配置 - iTeknical
  9. masscan端口扫描
  10. 112家IT网络公司薪水一览表
  11. 如何生成SSH key以及免密设置
  12. unity2D笔记-控制人物相关
  13. 晓前端·周刊【第6期】:量子霸权
  14. html实现播放暂停,html如何实现播放和暂停
  15. RVN 一种新的聚类算法
  16. 入门使用-腾讯地图API
  17. Google Hacking 搜索教程,一步到位。
  18. 在VS 2019中使用HDF5的C API遍历HDF5数据集
  19. 【图像分割】基于方向谷形检测实现静脉纹路分割附MATLAB代码
  20. 隐形数字水印_Android 实现图片水印与隐形数字水印

热门文章

  1. 论文翻译与总结:Relational modeling for robust and efficient pulmonary lobe segmentation in CT scans
  2. linux alsa 录音程序,转 alsa录音放音执行流程详解
  3. PAT : 团体程序设计天梯赛-练习集L1 个人题解
  4. 赵大超的学习周志(八)
  5. 【板栗糖GIS】arcmap—修改右下角坐标单位为经纬度
  6. 百战RHCE(第七战:Linux进阶命令5-sudo提权极简管理)
  7. 【木桶规则】图像缩放到目标尺寸 Python
  8. 63、GIRAFFE: Representing Scenes as Compositional Generative Neural Feature Fields
  9. Cesium.knockout使用
  10. Credit Card Approval Predict w/ Towhee