WPF: событие изменения размера GridViewColumn

Я использую ListView с GridView. Есть ли событие изменения размера GridViewColumn?


person Marat Faskhiev    schedule 05.02.2010    source источник


Ответы (5)


Посмотрите детали MSDN DridViewColumn. Похоже, такого события нет, возможно, требуется какой-то обходной путь, хотя я не уверен. смотрите здесь

Надеюсь, поможет.

person Asad    schedule 05.02.2010

Вместо этого я обработаю событие PropertyChanged. Событие PropertyChanged не видно в IntelliSense Visual Studio, но его можно обмануть :)

 GridViewColumn column = ...
 ((System.ComponentModel.INotifyPropertyChanged)column).PropertyChanged += (sender, e) =>
 {
     if (e.PropertyName == "ActualWidth")
     {
         //do something here...
     }
 };
person chenz    schedule 16.02.2010
comment
Очень красиво (+1). См. здесь внедрение этого метода в прикрепленном свойстве: wpftoolbelt.codeplex.com /SourceControl/changeset/view/. - person Helge Klein; 04.01.2011

Хотя GridViewColumn не имеет события Resize, вы можете выполнить привязку к свойству ColumnWidth.

Вы можете проверить это с помощью приведенного ниже примера XAML — для этого примера не требуется дополнительный код. Он привязывается только в одном направлении, от ширины столбца к текстовому полю, и при изменении размера вы увидите, что текстовое поле сразу же обновляется с шириной столбца.

(Это всего лишь простой пример; если вы хотите изменить размер в коде, я бы создал класс со свойством Width, чтобы привязка работала в обоих направлениях).

<StackPanel>
    <ListView>
        <ListView.View>
            <GridView>
                <GridViewColumn Width="{Binding ElementName=tbWidth1, Path=Text, Mode=OneWayToSource}"  />
                <GridViewColumn Width="{Binding ElementName=tbWidth2, Path=Text, Mode=OneWayToSource}"  />
            </GridView>
        </ListView.View>
        <ListViewItem>Item 1</ListViewItem>
        <ListViewItem>Item 2</ListViewItem>
    </ListView>
    <TextBox Name="tbWidth1" />
    <TextBox Name="tbWidth2" />
</StackPanel>
person Edward    schedule 05.02.2010

private void ListView_Loaded( object sender, RoutedEventArgs e )
{
     // Add the handler to know when resizing a column is done
     ((ListView)sender).AddHandler( Thumb.DragCompletedEvent, new   DragCompletedEventHandler( ListViewHeader_DragCompleted ), true );
}

private void ListViewHeader_DragCompleted( object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e )
{
     ListView lv = sender as ListView;
    ... code handing the resize goes here ...
}

XAML:

<ListView Loaded="ListView_Loaded">
person Bailey    schedule 16.04.2018
comment
Пожалуйста, добавьте текст, чтобы лучше объяснить это - person Rodrigo Werlang; 16.04.2018

Другой подход: вы можете прикрепить обработчик события изменения к свойству GridViewColumn Width:

PropertyDescriptor pd = DependencyPropertyDescriptor.FromProperty(
    GridViewColumn.WidthProperty, typeof(GridViewColumn));
GridView gv = (GridView)myListView.View;
foreach (GridViewColumn col in gv.Columns) {
    pd.AddValueChanged(col, ColumnWidthChanged);
}

...

private void ColumnWidthChanged(object sender, EventArgs e) { ... }

(На основе ответа здесь для аналогичного вопроса о DataGrid.)

person fadden    schedule 20.06.2019