/// <summary>ExpanderへGridSnapModeの設定</summary> /// <param name="obj"></param> /// <param name="mode"></param> public static void SetGridSnap(Expander obj, GridSnapMode mode) { if (obj == null) { return; } obj.SetValue(GridSnapProperty, mode); }
/// <summary>垂直方向時のExpanderの内部処理拡張メソッド</summary> /// <param name="expander"></param> /// <param name="mode"></param> private static void AttachMode_Vertical(this Expander expander, GridSnapMode mode) { if (expander == null) { return; } // イベント解除 expander.Expanded -= Expanded_Vertical; expander.Collapsed -= Collapsed_Vertical; Grid targetGrid = expander.FindAncestor <Grid>(); if (targetGrid == null) { return; } // 対象となるGridの情報を取得していく int gridRow = Grid.GetRow(expander); RowDefinition targetRowDefinition = targetGrid.RowDefinitions[gridRow]; // プロパティ内に情報をセット SetTargetRowDefinition(expander, targetRowDefinition); SetLastGridLength(expander, targetRowDefinition.Height); // GridSplitterを取得 GridSplitter gridSplitter = null; if (mode == GridSnapMode.Auto) { gridSplitter = targetGrid.FindDescendant <GridSplitter>(); } else { gridSplitter = GetTargetGridSplitter(expander); } if (mode == GridSnapMode.Explicit && gridSplitter == null) { // GridSplitterの移動をそのままにするのにGridSplitterがnullはあり得ない throw new ArgumentException("Mode [explicit] requires [TargetGridSplitter]"); } // Binding実行 gridSplitter.SetBinding(UIElement.VisibilityProperty, new Binding(nameof(Expander.IsExpanded)) { Mode = BindingMode.OneWay, Converter = BoolToVisibleConverter, Source = expander }); expander.Expanded += Expanded_Vertical; expander.Collapsed += Collapsed_Vertical; }
private static void AttachMode_Horizontal(this Expander expander, GridSnapMode mode) { if (expander == null) { return; } expander.Expanded -= Expanded_Horizontal; expander.Collapsed -= Collapsed_Horizontal; Grid targetGrid = expander.FindAncestor <Grid>(); if (targetGrid == null) { return; } if (mode == GridSnapMode.None) { return; } int gridColumn = Grid.GetColumn(expander); ColumnDefinition columnDefinition = targetGrid.ColumnDefinitions[gridColumn]; SetTargetColumnDefinition(expander, columnDefinition); // 初回にExpanderを開く際、開かれたGridのActualWidthをとれずに検索テキストボックスの幅が微小になってしまう // そのため、exeを立ち上げて最初にExpanderを開く際のみMainWindowの比で強引に値を入れてやる // Expanderを開く前はExpander側の幅を調節できないため、数値がおかしくなる心配はないと想定される if (_isFirst) { SetFirstGridLength(expander); } else { SetLastGridLength(expander, columnDefinition.Width); } GridSplitter gridSplitter = null; if (mode == GridSnapMode.Auto) { gridSplitter = targetGrid.FindDescendant <GridSplitter>(); } else { gridSplitter = GetTargetGridSplitter(expander); } if (mode == GridSnapMode.Explicit && gridSplitter == null) { throw new ArgumentException("[Explicit] requires [TargetGridSplitter]"); } gridSplitter.SetBinding(UIElement.VisibilityProperty, new Binding(nameof(Expander.IsExpanded)) { Mode = BindingMode.OneWay, Converter = BoolToVisibleConverter, Source = expander, }); expander.Expanded += Expanded_Horizontal; expander.Collapsed += Collapsed_Horizontal; }
public static void SetGridSnap(Expander obj, GridSnapMode value) { obj.SetValue(GridSnapProperty, value); }