Im hatte eine Auflistung mehrerer Grids untereinander, von denen eine Spalte mit der gleichen Spalte aller Grids identisch bleiben sollte.
/// <summary>
/// Hält die Spaltenbreite einer Spalte mehrerer Grids identisch.
/// </summary>
public sealed class MultiGridColumnWidthSynchronizer
{
private readonly int columnIndexToSync;
private readonly List<DataGrid> grids;
private double lastWidth;
private int lastColumnCount;
/// <summary>
/// Hält die Spaltenbreite einer Spalte mehrerer Grids identisch.
/// </summary>
/// <param name="grids"></param>
/// <param name="column">Spaltenindex der Spalte dessen Breite für alle Grids der gleichen Spalte gelten soll.
/// <para>Stellen Sie sicher, dass jedes angegebene Grid genügend Spalten zur Verfügung hat.</para></param>
public MultiGridColumnWidthSynchronizer(IEnumerable<DataGrid> grids, int column)
{
IsEnabled = true;
this.grids = new List<DataGrid>(grids);
columnIndexToSync = column;
registerEvents(grids);
}
public bool IsEnabled { get; set; }
private void registerEvents(IEnumerable<DataGrid> grids)
{
foreach (var curGrid in grids)
{
curGrid.LayoutUpdated -= curGrid_LayoutUpdated;
curGrid.LayoutUpdated += curGrid_LayoutUpdated;
}
}
private void curGrid_LayoutUpdated(object sender, EventArgs e)
{
if (!IsEnabled)
{
return;
}
// Alle Bezeichnung-Spalten aller Grids.
var dataGridColumns = (from dataGridItem in grids
where dataGridItem != null
select dataGridItem.Columns[columnIndexToSync]).ToList();
var senderColumn = dataGridColumns.FirstOrDefault(column => !Equals(Math.Round(column.ActualWidth, 1), lastWidth));
double useWidth = senderColumn == null ? lastWidth : Math.Round(senderColumn.ActualWidth, 1);
if (!useWidth.Equals(lastWidth))
{
if (lastColumnCount < dataGridColumns.Count &&
useWidth < lastWidth)
{
useWidth = lastWidth;
}
foreach (var column in dataGridColumns.Where(column => !Equals(column.Width.DesiredValue, useWidth)))
{
column.Width = Double.IsNaN(useWidth) ? DataGridLength.Auto : useWidth;
}
lastWidth = useWidth;
}
lastColumnCount = dataGridColumns.Count;
}
public void UpdateGrids(IEnumerable<DataGrid> grids)
{
this.grids.Clear();
this.grids.AddRange(grids);
registerEvents(this.grids);
}
}
Abgelegt unter
C#,
WPF,
Grid,
DataGrid,
Spalte,
Synchron,
Identische,
MultipleGrids,
SynchronizeColumnWidth,
Same,
EachGrid,
Columns.
Kommentare zum Snippet