xamDataGrid の列幅(カラム幅)の変更を検出する方法をいくつかご紹介します。
- LabelPresenter の SizeChanged イベントで検出する。
- Field の PropertyChanged イベントで検出する。
それぞれ見ていきましょう。
LabelPresenter の SizeChanged イベントで検出する方法
以下の実装例にしたがってお試しください。
XAML の実装例 <Grid> <Grid.Resources> <Style TargetType="{x:Type igDP:LabelPresenter}"> <EventSetter Event="SizeChanged" Handler="LabelPresenter_SizeChanged"/> 👈Style の EventSetter にて定義しています。 </Style> </Grid.Resources> <igDP:XamDataGrid Name="xamDataGrid1"/> </Grid>
コード の実装例 public partial class MainWindow : Window { ... // ウィンドウが完全にロードされたことを示すフラグを設定 private bool _isLoaded = false; private void Window_Loaded(object sender, RoutedEventArgs e) { _isLoaded = true; } private void LabelPresenter_SizeChanged(object sender, SizeChangedEventArgs e) { // アプリケーション起動時の実行を無視し、ウィンドウがロードされた後にのみ処理 if (_isLoaded) { MessageBox.Show("カラムがサイズ変更されました。"); } } }
コード側では、アプリ初回起動時にも発生する際にメッセージが出ないように分岐を入れています。
Field の PropertyChanged イベントで検出する方法
以下の実装例にしたがってお試しください。
今回は Loaded イベントで各 Field の PropertyChanged イベントに処理を割り当てています。
<Grid> <igDP:XamDataGrid Name="xamDataGrid1" Loaded="xamDataGrid1_Loaded"/> </Grid>
private void xamDataGrid1_Loaded(object sender, RoutedEventArgs e) { var dataGrid = sender as XamDataGrid; if (dataGrid != null) { // 全てのフィールドに対してPropertyChangedイベントを設定 foreach (var fieldLayout in dataGrid.FieldLayouts) { foreach (var field in fieldLayout.Fields) { field.PropertyChanged += OnFieldPropertyChanged; } } } } private void OnFieldPropertyChanged(object? sender, PropertyChangedEventArgs e) { Debug.WriteLine("PropertyChanged"); if (e.PropertyName != null && e.PropertyName.Contains("LabelWidth")) { Debug.WriteLine("LabelWidthResolved"); } else if (e.PropertyName != null && e.PropertyName.Contains("CellWidth")) { Debug.WriteLine("CellWidthResolved"); } }
列幅を調整した場合、PropertyChanged イベントでは PropertyChangedEventArgs の PropertyName に以下のいづれかの値が設定されてきますので、そちらを判定し検知してください。
- LabelWidthResolved
- CellWidthResolved