备用数据网格列宽度取决于WPF中的内容宽度

时间:2015-03-12 22:47:08

标签: c# wpf custom-controls

我正在寻找一种在WPF中设置数据网格列宽的方法,以便当数据网格通常显示它的水平滚动条时,意味着数据网格的宽度大于其父级容器,它将切换到自动大小的列。如果容器元素大于自动调整大小的数据网格,则将数据网格列宽设置为*,以便均匀分布。

目前我有一个自定义数据网格覆盖基础数据网格,其上包含AutomaticColumnWidths依赖项属性。将其设置为True将导致列均匀分布(*),False将切换为自动调整大小。

只要用户没有调整窗口大小,这就有效。如果他们确实调整了列的大小,则无论窗口大小如何,都将保持先前设置的模式。

有没有人对如何做到这一点有任何想法?我想过要弄清楚如何挂钩HorizontalScrollbarVisiblity属性,但是当它的可见性发生变化时,我没有看到要捕获的事件。

这是我当前的自定义DataGrid

public class CustomDataGrid : DataGrid
{

    /// <summary>Automatic column widths dependency property</summary>
    public static readonly DependencyProperty AutomaticColumnWidthsProperty = 
        DependencyProperty.Register("AutomaticColumnWidths", typeof(Boolean), typeof(CustomDataGrid), new PropertyMetadata(true));        

    /// <summary>Get/Set AutomaticColumnWidths</summary>
    public bool AutomaticColumnWidths
    {
        get
        { 
            return (bool)GetValue(AutomaticColumnWidthsProperty);
        }
        set 
        { 
            SetValue(AutomaticColumnWidthsProperty, value);
        }
    }

    /// <summary>
    /// Constructor
    /// </summary>
    public NauFilteredDataGrid()
    {
        this.SourceUpdated += OnSourceUpdated;                      
    }


    /// <summary>
    /// On source update event handler
    /// </summary>
    private void OnSourceUpdated(object sender, RoutedEventArgs e)
    {
        Dispatcher.Invoke(() => UpdateColumnMinWidths(), DispatcherPriority.ContextIdle);
    }

    /// <summary>
    /// Updates the column minimum widths
    /// </summary>
    private void UpdateColumnMinWidths()
    {
        if (AutomaticColumnWidths)
        {
            foreach (DataGridColumn col in this.Columns)
            {
                col.Width = 0;
                this.UpdateLayout();
                col.Width = new DataGridLength(1, DataGridLengthUnitType.Star); //1*
            }
        }
    }
}

0 个答案:

没有答案