namespace UICatalog.Scenarios; [ScenarioMetadata ("Pos.Align", "Demonstrates Pos.Align")] [ScenarioCategory ("Layout")] public sealed class PosAlignDemo : Scenario { private readonly Aligner _horizAligner = new () { AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.AddSpaceBetweenItems }; private int _leftMargin; private readonly Aligner _vertAligner = new () { AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.AddSpaceBetweenItems }; private int _topMargin; public override void Main () { // Init Application.Init (); // Setup - Create a top-level application window and configure it. Window appWindow = new () { Title = $"{Application.QuitKey} to Quit - Scenario: {GetName ()} - {GetDescription ()}" }; SetupControls (appWindow, Dimension.Width, Schemes.Runnable); SetupControls (appWindow, Dimension.Height, Schemes.Error); Setup3By3Grid (appWindow); // Run - Start the application. Application.Run (appWindow); appWindow.Dispose (); // Shutdown - Calling Application.Shutdown is required. Application.Shutdown (); } private void SetupControls (Window appWindow, Dimension dimension, Schemes scheme) { OptionSelector alignOptionSelector = new () { SchemeName = SchemeManager.SchemesToSchemeName (scheme) }; if (dimension == Dimension.Width) { alignOptionSelector.X = Pos.Align (_horizAligner.Alignment); alignOptionSelector.Y = Pos.Center (); } else { alignOptionSelector.X = Pos.Center (); alignOptionSelector.Y = Pos.Align (_vertAligner.Alignment); } alignOptionSelector.ValueChanged += (s, e) => { if (alignOptionSelector.Value is null) { return; } if (dimension == Dimension.Width) { _horizAligner.Alignment = alignOptionSelector.Value.Value; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.Alignment = alignOptionSelector.Value.Value; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (alignOptionSelector); CheckBox endToStartCheckBox = new () { SchemeName = SchemeManager.SchemesToSchemeName (scheme), Text = "EndToStart" }; if (dimension == Dimension.Width) { endToStartCheckBox.CheckedState = _horizAligner.AlignmentModes.HasFlag (AlignmentModes.EndToStart) ? CheckState.Checked : CheckState.UnChecked; endToStartCheckBox.X = Pos.Align (_horizAligner.Alignment); endToStartCheckBox.Y = Pos.Top (alignOptionSelector); } else { endToStartCheckBox.CheckedState = _vertAligner.AlignmentModes.HasFlag (AlignmentModes.EndToStart) ? CheckState.Checked : CheckState.UnChecked; endToStartCheckBox.X = Pos.Left (alignOptionSelector); endToStartCheckBox.Y = Pos.Align (_vertAligner.Alignment); } endToStartCheckBox.CheckedStateChanging += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.AlignmentModes = e.Result == CheckState.Checked ? _horizAligner.AlignmentModes | AlignmentModes.EndToStart : _horizAligner.AlignmentModes & ~AlignmentModes.EndToStart; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.AlignmentModes = e.Result == CheckState.Checked ? _vertAligner.AlignmentModes | AlignmentModes.EndToStart : _vertAligner.AlignmentModes & ~AlignmentModes.EndToStart; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (endToStartCheckBox); CheckBox ignoreFirstOrLast = new () { SchemeName = SchemeManager.SchemesToSchemeName (scheme), Text = "IgnoreFirstOrLast" }; if (dimension == Dimension.Width) { ignoreFirstOrLast.CheckedState = _horizAligner.AlignmentModes.HasFlag (AlignmentModes.IgnoreFirstOrLast) ? CheckState.Checked : CheckState.UnChecked; ignoreFirstOrLast.X = Pos.Align (_horizAligner.Alignment); ignoreFirstOrLast.Y = Pos.Top (alignOptionSelector); } else { ignoreFirstOrLast.CheckedState = _vertAligner.AlignmentModes.HasFlag (AlignmentModes.IgnoreFirstOrLast) ? CheckState.Checked : CheckState.UnChecked; ignoreFirstOrLast.X = Pos.Left (alignOptionSelector); ignoreFirstOrLast.Y = Pos.Align (_vertAligner.Alignment); } ignoreFirstOrLast.CheckedStateChanging += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.AlignmentModes = e.Result == CheckState.Checked ? _horizAligner.AlignmentModes | AlignmentModes.IgnoreFirstOrLast : _horizAligner.AlignmentModes & ~AlignmentModes.IgnoreFirstOrLast; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.AlignmentModes = e.Result == CheckState.Checked ? _vertAligner.AlignmentModes | AlignmentModes.IgnoreFirstOrLast : _vertAligner.AlignmentModes & ~AlignmentModes.IgnoreFirstOrLast; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (ignoreFirstOrLast); CheckBox addSpacesBetweenItems = new () { SchemeName = SchemeManager.SchemesToSchemeName (scheme), Text = "AddSpaceBetweenItems" }; if (dimension == Dimension.Width) { addSpacesBetweenItems.CheckedState = _horizAligner.AlignmentModes.HasFlag (AlignmentModes.AddSpaceBetweenItems) ? CheckState.Checked : CheckState.UnChecked; addSpacesBetweenItems.X = Pos.Align (_horizAligner.Alignment); addSpacesBetweenItems.Y = Pos.Top (alignOptionSelector); } else { addSpacesBetweenItems.CheckedState = _vertAligner.AlignmentModes.HasFlag (AlignmentModes.AddSpaceBetweenItems) ? CheckState.Checked : CheckState.UnChecked; addSpacesBetweenItems.X = Pos.Left (alignOptionSelector); addSpacesBetweenItems.Y = Pos.Align (_vertAligner.Alignment); } addSpacesBetweenItems.CheckedStateChanging += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.AlignmentModes = e.Result == CheckState.Checked ? _horizAligner.AlignmentModes | AlignmentModes.AddSpaceBetweenItems : _horizAligner.AlignmentModes & ~AlignmentModes.AddSpaceBetweenItems; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.AlignmentModes = e.Result == CheckState.Checked ? _vertAligner.AlignmentModes | AlignmentModes.AddSpaceBetweenItems : _vertAligner.AlignmentModes & ~AlignmentModes.AddSpaceBetweenItems; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (addSpacesBetweenItems); CheckBox margin = new () { SchemeName = SchemeManager.SchemesToSchemeName (scheme), Text = "Margin" }; if (dimension == Dimension.Width) { margin.X = Pos.Align (_horizAligner.Alignment); margin.Y = Pos.Top (alignOptionSelector); } else { margin.X = Pos.Left (addSpacesBetweenItems); margin.Y = Pos.Align (_vertAligner.Alignment); } margin.CheckedStateChanging += (s, e) => { if (dimension == Dimension.Width) { _leftMargin = e.Result == CheckState.Checked ? 1 : 0; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _topMargin = e.Result == CheckState.Checked ? 1 : 0; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (margin); List