WPF容器控件

WPF有五种容器控件,分别为Grid,Canvas,StackPanel,WrapPanel,DockPanel

Grid:

      1、Height=”60”:不加“星号”表示固定的高度 

      2、Height=”60*”:加“星号”表示“加权”的高度,在调整窗体大小时,此高度或宽度会按窗体大小改变的比例进行缩放。

      3、另外,可以使用GridSplit控件结合Grid控件实现类似于Windows应用程序中SplitContainer的功能

Canvas:

      唯一一个支持绝对定位的容器控件,也就是说你可以将里面的控件放置在距离面板的任一角有一定偏移量的位置。

      包含四种属性:Top、Bottom、Right 和 Left。

      Canvas控件内包含的控件必须指定一个水平属性和一个垂直属性,并借此指定该控件将要偏离的角。是最灵活的一个面板。

StackPanel:

      StackPanel 要么垂直叠放包含的控件,要么将包含的WPF容器控件排列在水平行中,具体情况取决于 Orientation 属性的值。

      如果将比 StackPanel 的宽度能显示的控件还要多的控件添加到 StackPanel 中,这些控件将被截掉且不显示。

WrapPanel

      功能和StackPanel有写类似,不过多加了换行支持。

      因此,如果将比 WrapPanel 的宽度能显示的控件还要多的控件添加到 WrapPanel 中,这些控件将换行以形成另一个叠放或行。

DockPanel

      DockPanel 提供停靠支持,以便让工具栏或您希望停靠在面板一侧的其他控件容易定位。

      DockPanel 控件以上、下、左、右、中为基本结构的布局方式,每一个区域可以同时放置多个控件,在同一区域放置的多个控件采用的布局方式为StackPanel方式

### 实现WPF容器控件中的拖拽功能 在WPF应用程序中,为了使容器控件能够支持拖拽操作,通常会采用一种组合方法来处理不同阶段的操作。这不仅涉及到UI层面上的变化,还需要确保底层的数据模型同步更新以反映这些变化。 #### 使用`AllowDrop`属性启用目标区域接受拖放行为 对于希望接收被拖动对象的目标容器(比如Grid, StackPanel等),设置其`AllowDrop="True"`属性是非常重要的第一步[^1]。此设置允许该元素成为合法的放置位置。 #### 处理拖拽事件 当用户开始在一个项目上按下鼠标按钮并移动时触发拖拽过程。可以通过为源列表视图项添加预览鼠标的左键按下的事件处理器来捕捉这一动作: ```csharp private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var item = sender as ListViewItem; if (item != null && item.Content is YourDataType dataItem) { DragDrop.DoDragDrop(item, new DataObject(typeof(YourDataType), dataItem), DragDropEffects.Move); } } ``` 上述代码片段展示了如何启动一次拖拽操作,并传递所选项目的实际数据作为拖拽的内容[^2]。 #### 接收拖拽过来的对象 为了让另一个容器能识别并响应即将放入其中的新成员,在目标容器处需监听`Drop`事件: ```csharp private void TargetContainer_Drop(object sender, DragEventArgs e) { if (!e.Data.GetDataPresent(typeof(YourDataType))) return; var targetPoint = e.GetPosition((IInputElement)sender); // 获取相对坐标 var newItem = e.Data.GetData(typeof(YourDataType)) as YourDataType; // 更新ViewModel逻辑... } ``` 这段C#代码负责检查传入的数据是否是我们期望类型的实例,并据此采取相应行动,例如调整集合顺序或向新位置添加条目。 #### 数据绑定与MVVM模式的应用 考虑到现代应用开发实践推崇使用MVVM架构分离关注点,则应当让View Model管理所有业务规则和状态转换工作。这意味着任何由拖拽引起的变更都应通过命令(Command)或者直接修改ObservableCollection这样的可观察集合来进行通知,从而保持界面自动刷新的一致性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值