WPF DataGrid生成的UI,在拖动分割框后,被自动还原
时间: 2024-12-13 13:25:27 浏览: 42
WPF中的DataGrid控件是一个用于显示和编辑数据的表格,它会根据数据源动态调整列宽。当你在DataGrid的列分隔线上拖动时,可以调整列的宽度。然而,如果你释放鼠标并离开分隔线,WPF默认的行为通常是保持当前列宽的设置,不会立即恢复到原始大小。这是为了让用户能够轻松地自适应布局。
如果你想在用户松开鼠标后自动还原列宽,你可以通过设置`AutoGenerateColumns`属性为`False`,并在代码中为每个列手动配置固定的Width属性。另外,也可以监听`ColumnWidthChanging`事件,然后在该事件中处理复原操作。
例如:
```xaml
<DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Width="*"/>
<!-- 其他列 -->
</DataGrid.Columns>
</DataGrid>
```
在代码背后:
```csharp
dataGrid.ColumnWidthChanging += (sender, args) =>
{
if (!args.IsUserInitiated)
{
// 当系统自动调整时(如窗口大小改变),恢复默认宽度
args.NewWidth = defaultWidth;
}
};
```
相关问题
wpf datagrid行拖拽 mysql
要实现 WPF DataGrid 行拖拽并保存到 MySQL 数据库,可以按照以下步骤进行操作:
1. 在 XAML 中将 DataGrid 的 CanUserSortColumns 和 CanUserResizeColumns 属性设置为 False,以禁用列排序和列宽调整功能。同时设置 DataGrid 的 CanUserReorderColumns 和 CanUserReorderRows 属性为 True,以启用列和行的重排序功能。
2. 在 DataGrid 的 RowStyle 中添加 PreviewMouseLeftButtonDown、PreviewMouseMove 和 PreviewMouseLeftButtonUp 事件处理程序,分别处理行拖拽的开始、移动和结束事件。在这些事件处理程序中,可以通过 Mouse.GetPosition 和 VisualTreeHelper.FindElementsInHostCoordinates 方法获取当前鼠标位置和目标行,然后在 DataGrid 的 ItemsSource 中调整行的位置,并在 UI 中更新行的显示顺序。
3. 在保存数据到 MySQL 数据库时,可以将 DataGrid 的 ItemsSource 转换为 DataTable,然后使用 MySQL Connector/NET 提供的 MySqlCommand 和 MySqlDataAdapter 对象执行 INSERT、UPDATE 和 DELETE SQL 语句,以保存修改后的数据。
以下是一个示例代码,可供参考:
```csharp
private void DataGrid_RowStyle(object sender, EventArgs e)
{
DataGridRow row = e.OriginalSource as DataGridRow;
if (row != null)
{
row.PreviewMouseLeftButtonDown += DataGrid_RowPreviewMouseLeftButtonDown;
row.PreviewMouseMove += DataGrid_RowPreviewMouseMove;
row.PreviewMouseLeftButtonUp += DataGrid_RowPreviewMouseLeftButtonUp;
}
}
private void DataGrid_RowPreviewMouseLeftButtonDown(object sender, EventArgs e)
{
DataGridRow row = sender as DataGridRow;
if (row != null)
{
_draggedItem = row.Item;
_draggedIndex = DataGrid.Items.IndexOf(_draggedItem);
_draggedRow = row;
_draggedRow.IsSelected = true;
_dragStartPoint = Mouse.GetPosition(DataGrid);
}
}
private void DataGrid_RowPreviewMouseMove(object sender, EventArgs e)
{
if (_draggedItem != null && _draggedRow != null)
{
Point currentPoint = Mouse.GetPosition(DataGrid);
Vector diff = _dragStartPoint - currentPoint;
if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
DataGridRow row = sender as DataGridRow;
DataObject dragData = new DataObject("DataGridRow", row);
DragDrop.DoDragDrop(_draggedRow, dragData, DragDropEffects.Move);
}
}
}
private void DataGrid_RowPreviewMouseLeftButtonUp(object sender, EventArgs e)
{
_draggedItem = null;
_draggedIndex = -1;
_draggedRow = null;
}
private void DataGrid_Drop(object sender, DragEventArgs e)
{
if (_draggedItem != null && _draggedRow != null)
{
Point dropPoint = e.GetPosition(DataGrid);
int newIndex = DataGrid.Items.IndexOf(DataGrid.HitTest(dropPoint).VisualHit);
if (newIndex < 0)
{
newIndex = DataGrid.Items.Count - 1;
}
if (newIndex != _draggedIndex)
{
DataGrid.Items.RemoveAt(_draggedIndex);
DataGrid.Items.Insert(newIndex, _draggedItem);
DataGrid.SelectedItem = _draggedItem;
}
}
}
private void SaveData()
{
DataTable table = ((DataView)DataGrid.ItemsSource).ToTable();
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
using (MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM mytable", conn))
{
MySqlCommandBuilder builder = new MySqlCommandBuilder(adapter);
adapter.InsertCommand = builder.GetInsertCommand();
adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.DeleteCommand = builder.GetDeleteCommand();
adapter.Update(table);
}
}
}
```
注意,这只是一个简单的示例代码,实际应用中还需对数据进行验证、异常处理和安全性检查等。
WPF DataGrid 鼠标拖动列宽 修改事件
WPF中的DataGrid控件提供了一个内置的功能,允许用户通过鼠标拖动列头来调整列宽。当用户开始拖动列头时,会触发`ColumnHeaderMouseWheel` 或 `ColumnWidthChanging` 事件,但这并不是直接用于鼠标拖动操作。真正的列宽改变事件是`ColumnWidthChanged`,这个事件会在用户完成列宽调整时发生。
当你需要处理列宽的更改,你可以通过以下几个步骤:
1. 在XAML中,给DataGrid添加一个`ColumnWidthChanged`事件处理器:
```xaml
<DataGrid ...>
<DataGrid.ColumnWidthChanged>
<EventTrigger RoutedEvent="DataGrid.ColumnWidthChanged">
<CommandBinding Command="{YourCommand}" />
</EventTrigger>
</DataGrid.ColumnWidthChanged>
</DataGrid>
```
这里将事件绑定到自定义命令或一个已存在的命令上,`YourCommand` 需要用你的代码实现相应的行为。
2. 在后台代码(如C#)中,编写响应`ColumnWidthChanged`事件的方法:
```csharp
private void YourCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{
DataGridColumn column = (sender as ColumnDefinition).Parent as DataGridColumn;
// 在这里你可以获取到列的信息,比如宽度,然后做你需要的操作
double newWidth = column.Width; // 获取新宽度
// 更新数据或UI逻辑...
}
```
阅读全文
相关推荐

















