WPF:理解ContentControl——动态添加控件和查找控件

WPF:理解ContentControl——动态添加控件和查找控件

2023年7月19日发(作者:)

WPF:理解ContentControl——动态添加控件和查找控件我认为WPF的核⼼改变之⼀就是控件模型发⽣了重要的变化,⼤的⽅⾯说,现在窗⼝中的控件(⼤部分)都没有独⽴的Hwnd了。⽽且控件可以通过所谓的模板提供各种各样的表现形式。这⼀篇就来谈⼀谈ContentControl,的第⼀部分,动态添加控件和查找控件什么是ContentControl呢?其实WPF的绝⼤部分的控件,还包括窗⼝本⾝都是继承⾃ContentControl的。

有的时候,我们需要在窗⼝出来之后,再动态添加⼀些控件。例如⼀个最简单的场景:我们需要做⼀个扫雷程序,该扫雷程序根据⽤户选择的难易程度决定要显⽰多少个地雷。为了便于理解,⼤家可以看下⾯这三个图⽚

ok,我们还是回想⼀下在Windows Forms⾥⾯怎么做?using System;using ;namespace WindowsFormsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //初级版,实例化6*6⼀共64个按钮 CreateButton(6, 6); } private void button2_Click(object sender, EventArgs e) { //⾼级版,实例化9*9⼀共81个按钮 CreateButton(9, 9); } private void CreateButton(int x, int y) { dLayout(); (); //四个⽅向的边距都是5 int width = (-(x+1)*5)/x; int height = (-(y+1)*5)/y; for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { Button bt = new Button() { Width = width, Height = height, Left = i*width+5, Top = j*height+5 }; (bt);

} } Layout(); } }}我们可以花⼀点点时间稍微解释⼀下,其实我们就是⽤循环的⽅式,动态地创建了⼀批按钮出来,然后将他们添加到Panel的Controls集合中去。那么,同样的思路放在WPF中来是否可⾏呢?我们⼀步⼀步来看吧⾸先,在WPF中进⾏布局控制有⼏个主要的容器Canvas是按照绝对位置定位的,很像上⾯的Panel这种机制;StackPanel呢,则是基于流模式的,它没有绝对定位的概念,⼀批控件要么从左到右排列,要么从上⽽下排列Grid,可能是⽤的最多的,它可以提供按照⾏和列的⽅式更好地组织控件。⽽事实上,在Grid⾥⾯也可以嵌⼊Canvas和StackPanel,他们结合可以构造出⾜够复杂的 界⾯。

那么,我们就来尝试⽤Canvas实现与Windows Forms类似的效果吧那么,我们的代码有什么区别呢?第⼀部分是XAML代码 第⼆部分是C#代码using s;using ls;namespace WpfApplication1{ ///

/// 的交互逻辑 /// public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void button1_Click(object sender, RoutedEventArgs e) { CreateButton(6, 6); } private void button2_Click(object sender, RoutedEventArgs e) { CreateButton(9, 9); } private void CreateButton(int x, int y) {

(); //四个⽅向的边距都是5 double width = (Width - (x + 1) * 5) / x; double height = (Height - (y + 1) * 5) / y; for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { Button bt = new Button() { Width = width, Height = height }; (bt, j * height + 5); t(bt, i * width + 5); //这两句很关键。按钮在Canvas中的定位与它⾃⼰的Left以及Top不是⼀个概念

(bt);

} }

} }}我们发现了以下区别1. 现在没有Controls这个概念了,⽽是有⼀个Children属性,代表了所有的⼦内容2.针对不同的容器,有⼀些特殊的⽅法来定位⼦元素。例如Canvas的SetTop等⽅法 。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689721944a281082.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信