2010-10-25 55 views
12

我正在使用WPF工具包Datagrid在我正在工作的应用程序之一。我想要的是将列宽和displayindex存储为用户首选项。我为列displayindex已达到它,但对于resize我无法找到任何事件的数据网格,这将触发后列大小更改。 我已经尝试过“SizeChanged”事件,我猜想它只是在最初计算大小时触发的,并且也是针对整个数据网格而不是针对各个列。
任何替代解决方案或者是否有人知道该事件?WPF工具包DataGrid列调整大小事件

回答

-1

您可以尝试延长DataGrid然后执行NotifyPropertyChange事件。就像这样:

class MyDataGrid : DataGrid, INotifyPropertyChanged 
{ 
    private DataGridLength _columnWidth; 
    public DataGridLength ColumnWidth 
    { 
     get { return _columnWidth; } 
     set 
     { 
      _columnWidth = value; 
      NotifyPropertyChanged("ColumnWidth"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

从那里,你可以添加一个delagate处理程序来做你想做的任何事情。喜欢的东西:

MyDataGrid dataGrid; 
//init grid, do stuff 

dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged); 
//ColumnWidthChanged will be a method you define 

现在,你有delagate,你可以定义你想要什么样的结果列的宽度改变:

private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args) 
{ 
    if(args.PropertyName.Equals("ColumnWidth")) 
    { 
     //Do stuff now that the width is changed 
    } 
} 

你会注意到,我检查其财产被改变了。我设置它的方式是可以扩展其他属性并为其更改制作处理程序。如果你想要多一个处理程序,那么最好使用一个DataGridPropertyChanged方法来打开哪些属性被更改。然后它会为每个被更改的属性调用适当的方法(如ColumnWidthChanged)。这样,你不必检查每个处理程序只修改一个属性。

您没有指定一种语言,所以我将其重新标记为C#。但是,如果这是你正在使用的,它应该很简单,转移到VB。

希望这会有所帮助!

+0

这并不能真正帮助,因为你只得到了一个列的宽度,如果柱在代码调整您的活动只会引起人们的关注,有些东西你可以捕获反正。 – MikeKulls 2011-11-25 02:40:06

0

我假设你想要保存列的宽度,以便在下一次应用程序启动时使用相同的列宽来生成数据网格。

如果是这种情况,则另一种方法是在应用程序关闭时保存列宽(和索引),这比每次调整列大小时保存宽度更有效。

根据您的应用程序是如何构成的,这样的事情应该工作...

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    foreach (DataGridColumn column in dataGrid1.Columns) 
    { 
    // save the column.Width property to a user setting/file/registry/etc... 
    // optionally save the displayindex as well... 
    } 
} 
+0

嗨,你可以请给我一些线索,如何将值从C#复制到XAML?我试过这个: Dictionary list = new Dictionary (); (DataGridView.Columns中的DataGridColumn列) DataGridLength x = column.Width; list.Add(column.Header.ToString(),x); } – user1850936 2014-11-27 08:05:13

9

取自...:

PropertyDescriptor pd = DependencyPropertyDescriptor 
          .FromProperty(DataGridColumn.ActualWidthProperty, 
              typeof(DataGridColumn)); 

     foreach (DataGridColumn column in Columns) { 
       //Add a listener for this column's width 
       pd.AddValueChanged(column, 
            new EventHandler(ColumnWidthPropertyChanged)); 
     } 

http://forums.silverlight.net/post/602788.aspx

负荷后

2种方法:

private bool _columnWidthChanging; 
    private void ColumnWidthPropertyChanged(object sender, EventArgs e) 
    { 
     // listen for when the mouse is released 
     _columnWidthChanging = true; 
     if (sender != null) 
      Mouse.AddPreviewMouseUpHandler(this, BaseDataGrid_MouseLeftButtonUp); 
    } 

    void BaseDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (_columnWidthChanging) { 
      _columnWidthChanging = false; 
      // save settings, etc 

     } 
    } 

ColumnWidthPropertyChanged在用户拖动宽度时不断激发。添加PreviewMouseUp处理程序可让您在用户完成时进行处理。

+0

如果我们使用双击,它不起作用。双击设置“自动”列宽。 – Rover 2012-05-24 06:39:27

+1

@Rover ...但双击有一个简单的事件赶上。我看不出有什么问题。 – 2012-05-24 08:56:01

+0

一个问题是,你添加了很多事件处理程序 – stefan 2016-06-03 15:00:01

1

LayoutUpdated?

我在Silverlight中工作,网格每秒钟都会反弹/刷新。

我正在使用LayoutUpdated方法,该方法针对每个布局更新事件触发。

您可以保留列宽的字典并检查增量。然后你会知道哪些列已经改变。

foreach (DataGridColumn column in dataGrid1.Columns) 
{ 
    // check for changes... 
    // save the column.Width property to a dictionary... 
}