File: AdaptiveTrigger.cs
Web Access
Project: src\src\Controls\src\Core\Controls.Core.csproj (Microsoft.Maui.Controls)
using System;
using System.ComponentModel;
 
namespace Microsoft.Maui.Controls
{
	/// <include file="../../docs/Microsoft.Maui.Controls/AdaptiveTrigger.xml" path="Type[@FullName='Microsoft.Maui.Controls.AdaptiveTrigger']/Docs/*" />
	public sealed class AdaptiveTrigger : StateTriggerBase
	{
		VisualElement? _visualElement;
		Window? _window;
 
		/// <include file="../../docs/Microsoft.Maui.Controls/AdaptiveTrigger.xml" path="//Member[@MemberName='.ctor']/Docs/*" />
		public AdaptiveTrigger()
		{
		}
 
		/// <include file="../../docs/Microsoft.Maui.Controls/AdaptiveTrigger.xml" path="//Member[@MemberName='MinWindowHeight']/Docs/*" />
		public double MinWindowHeight
		{
			get => (double)GetValue(MinWindowHeightProperty);
			set => SetValue(MinWindowHeightProperty, value);
		}
 
		/// <summary>Bindable property for <see cref="MinWindowHeight"/>.</summary>
		public static readonly BindableProperty MinWindowHeightProperty =
			BindableProperty.Create(nameof(MinWindowHeight), typeof(double), typeof(AdaptiveTrigger), -1d,
				propertyChanged: OnMinWindowDimensionChanged);
 
		/// <include file="../../docs/Microsoft.Maui.Controls/AdaptiveTrigger.xml" path="//Member[@MemberName='MinWindowWidth']/Docs/*" />
		public double MinWindowWidth
		{
			get => (double)GetValue(MinWindowWidthProperty);
			set => SetValue(MinWindowWidthProperty, value);
		}
 
		/// <summary>Bindable property for <see cref="MinWindowWidth"/>.</summary>
		public static readonly BindableProperty MinWindowWidthProperty =
			BindableProperty.Create(nameof(MinWindowWidth), typeof(double), typeof(AdaptiveTrigger), -1d,
				propertyChanged: OnMinWindowDimensionChanged);
 
		static void OnMinWindowDimensionChanged(BindableObject bindable, object oldvalue, object newvalue) =>
			((AdaptiveTrigger)bindable).UpdateState();
 
		protected override void OnAttached()
		{
			base.OnAttached();
 
			AttachEvents();
 
			UpdateState(true);
		}
 
		protected override void OnDetached()
		{
			base.OnDetached();
 
			DetachEvents();
		}
 
		void AttachEvents()
		{
			DetachEvents();
 
			_visualElement = VisualState?.VisualStateGroup?.VisualElement;
 
			_window = _visualElement?.Window;
			if (_window is not null)
			{
				_window.SizeChanged += OnWindowSizeChanged;
			}
		}
 
		void DetachEvents()
		{
			_visualElement = null;
 
			if (_window is not null)
			{
				_window.SizeChanged -= OnWindowSizeChanged;
			}
			_window = null;
		}
 
		void OnWindowSizeChanged(object? sender, EventArgs e)
		{
			UpdateState();
		}
 
		void UpdateState(bool knownAttached = false)
		{
			if (!knownAttached && !IsAttached)
				return;
 
			var w = _window?.Width ?? -1;
			var h = _window?.Height ?? -1;
 
			if (w == -1 || h == -1)
				return;
 
			var mw = MinWindowWidth;
			var mh = MinWindowHeight;
 
			SetActive(w >= mw && h >= mh);
		}
	}
}