一、添加一个StackPanel后在其中多个添加控件为什么后面添加的控件会把前面添加的给覆盖呢?能从工具箱拖拽多个控件到一个StackPanel中吗1、StackPanel 的本性StackPanel 在运行时会把子控件一个接一个地垂直排列或水平排列绝对不会重叠。2、如何正确地在 StackPanel 中添加多个控件你有三种稳妥的方法按推荐程度排序方法一直接在 XAML 代码里写最推荐最干净在设计器右侧点击“XAML”视图。在StackPanel标签内部手动敲入多个控件。你会发现无论写多少个它们自动从上到下排列绝不会有重叠问题代码也极其干净。StackPanel Button Content按钮1 Height30 / Button Content按钮2 Height30 / !-- 自动排在下面 -- Button Content按钮3 Height30 / !-- 继续往下排 -- /StackPanel方法二利用设计器的“蓝色对齐线”拖拽如果你非要用鼠标拖注意看蓝色实线Snap Line拖住控件往 StackPanel 里放时不要直接扔在中央。要拖到现有控件的边缘比如正下方或正上方直到出现一条蓝色的粗线提示你“将要放在此处”再松手。这样 VS 会正确识别为“追加”而不会生成怪异的 Margin。方法三拖进去后手动删掉 Margin补救措施如果已经拖进去了并且重叠了不要慌。在 XAML 代码中找到你刚拖进去的控件删掉它的Margin属性或者把它改成Margin0。你会发现它立刻乖乖地排到下面去了。3. 避坑指南特别重要在设计器中只有Canvas画布是你能随意重叠摆放的因为它依赖于绝对的Left和Top坐标。而对于StackPanel、Grid、DockPanel这类“自动布局”容器强烈不建议过度依赖鼠标拖拽来排序。因为 VS 的拖拽引擎会把它们当“画布”来生成坐标。给新手的黄金法则用“拖拽”来创建第一个控件省得打字用“复制粘贴 XAML 代码”来创建后续控件保证整齐。比如你拖了一个按钮进去觉得位置对了。想加第二个CtrlC 复制那行 XAMLCtrlV 粘贴在后面然后改个 Content 文字就行。这样绝不会有覆盖问题而且速度快 10 倍二、为什么 ProgressBar 和 Button 不能水平排列根本原因StackPanel的默认排列方向是“垂直”的。在 WPF 中StackPanel有一个属性叫Orientation方向。它的默认值是Vertical垂直。这意味着不管你往里面拖入多少个控件它都会强制把它们从上到下一个接一个地堆放。解决方法在 XAML 中找到你的StackPanel标签给它加上OrientationHorizontal刷新后ProgressBar 和 Button 就会立刻变成从左到右排列了。三、为什么控件“移不动”无法随意拖拽位置根本原因StackPanel是一个“自动排布”容器不是“画布”。在StackPanel以及Grid、DockPanel中控件的位置不是由鼠标拖拽的坐标决定的而是由“添加的顺序”和“边距Margin”决定的。你在设计器里用鼠标拖拽时VS 实际上是在偷偷修改这个控件的Margin边距属性。但是在 StackPanel 的规则下无论你把这个控件拖到哪个角落它都会被强制拉回队列中排在上一个控件的下面或右边。这就是你感觉“移不动”、“卡住了”的原因——不是鼠标坏了而是 StackPanel 不允许自由移动。四、 如果你想“自由移动”位置该怎么办WPF 提供了专门的容器来处理不同的需求如果你要“自由拖拽、随意摆放”像画图软件一样请使用Canvas画布。把 StackPanel 换成 Canvas里面的控件就可以随意拖到任何坐标位置了VS 会自动生成Canvas.Left和Canvas.Top属性。如果你要“水平排列但保持整齐”把 StackPanel 的Orientation改成Horizontal然后通过调整Margin和Width来控制间距。如果你要“像表格一样精确对齐”建议改用Grid网格用行和列来固定位置比 StackPanel 更可控。1