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