Kéo dài cột DataGrid cuối cùng
Tôi đang cố gắng triển khai một phương pháp để kéo dài tự động cột cuối cùng. Tôi đã tạo lớp mới FancyDataGridvà xác định một lớp được DependencyPropertygọi StretchLastColumnProperty. Khi nó đúng, phương thức sau được kích hoạt bởi LayoutUpdatedsự kiện:
private void StretchLastColumnToTheBorder()
{
var widthSum = 0d;
for (int i = 0; i < Columns.Count; i++)
{
widthSum += Columns[i].ActualWidth;
if (i == Columns.Count - 1 && this.ActualWidth > widthSum)
{
var newWidth = Math.Floor(Columns[i].ActualWidth + (this.ActualWidth - widthSum)) -
(this.BorderThickness.Left + this.BorderThickness.Right);
Columns[i].Width = new DataGridLength(newWidth, DataGridLengthUnitType.Pixel);
}
}
}
Mặc dù phương pháp này hoạt động với quy mô nhỏ DataGrid, nhưng nó không hoạt động tốt nếu lưới này đủ cao để có một thanh cuộn dọc. Trong trường hợp này, cột cuối cùng trở nên quá rộng và sự khác biệt không chỉ là chiều rộng thanh cuộn.
Có gì sai với phương pháp của tôi? Làm cách nào để điều chỉnh chiều rộng cột cuối cùng, có tính đến chiều rộng thanh cuộn?
CHỈNH SỬA: Đặt chiều rộng cột cuối cùng thành dấu hoa thị chỉ hoạt động ban đầu. Khi cột đã được thay đổi kích thước, chiều rộng của cột sẽ không được điều chỉnh nữa.
Trả lời
Tôi đã nhìn vào hệ thống phân cấp của các DataGridmẫu và nhận thấy, bên trong ColumnHeadersPresentercó chính xác chiều rộng của khung nhìn ( DataGridchiều rộng trừ các đường viền trái và phải trừ chiều rộng thanh cuộn dọc). Vì vậy, sử dụng phương pháp từ câu hỏi này, bạn có thể tìm thấy phần tử này và lấy chiều rộng của nó:
public double? ViewPortWidth
{
get
{
return FindChild<DataGridColumnHeadersPresenter>(this, "PART_ColumnHeadersPresenter")?.ActualWidth;
}
}
và sau đó sử dụng nó để tính chiều rộng cần thiết:
private void StretchLastColumnToTheBorder()
{
if (ViewPortWidth.HasValue)
{
var widthSum = 0d;
for (int i = 0; i < Columns.Count; i++)
{
if (i == Columns.Count - 1 && ViewPortWidth > widthSum + Columns[i].MinWidth)
{
var newWidth = Math.Floor(ViewPortWidth.Value - widthSum);
Columns[i].Width = new DataGridLength(newWidth, DataGridLengthUnitType.Pixel);
return;
}
widthSum += Columns[i].ActualWidth;
}
}
}
Lưu ý rằng nếu bạn kéo căng các cột bên trái, cột cuối cùng sẽ co lại MinWidthtrước khi nó bắt đầu di chuyển sang phải (ra khỏi khung nhìn), làm cho thanh cuộn ngang xuất hiện.