using System; using System.ComponentModel; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Rendering; using Avalonia.Styling; using Avalonia.VisualTree; #nullable enable namespace Avalonia.Controls { /// /// Base class for Avalonia controls. /// /// /// The control class extends and adds the following features: /// /// - A property to allow user-defined data to be attached to the control. /// public class Control : InputElement, IControl, INamed, IVisualBrushInitialize, ISetterValue { /// /// Defines the property. /// public static readonly StyledProperty?> FocusAdornerProperty = AvaloniaProperty.Register?>(nameof(FocusAdorner)); /// /// Defines the property. /// public static readonly StyledProperty TagProperty = AvaloniaProperty.Register(nameof(Tag)); /// /// Defines the property. /// public static readonly StyledProperty ContextMenuProperty = AvaloniaProperty.Register(nameof(ContextMenu)); /// /// Event raised when an element wishes to be scrolled into view. /// public static readonly RoutedEvent RequestBringIntoViewEvent = RoutedEvent.Register("RequestBringIntoView", RoutingStrategies.Bubble); private DataTemplates? _dataTemplates; private IControl? _focusAdorner; /// /// Gets or sets the control's focus adorner. /// public ITemplate? FocusAdorner { get => GetValue(FocusAdornerProperty); set => SetValue(FocusAdornerProperty, value); } /// /// Gets or sets the data templates for the control. /// /// /// Each control may define data templates which are applied to the control itself and its /// children. /// public DataTemplates DataTemplates => _dataTemplates ??= new DataTemplates(); /// /// Gets or sets a context menu to the control. /// public ContextMenu? ContextMenu { get => GetValue(ContextMenuProperty); set => SetValue(ContextMenuProperty, value); } /// /// Gets or sets a user-defined object attached to the control. /// public object? Tag { get => GetValue(TagProperty); set => SetValue(TagProperty, value); } public new IControl? Parent => (IControl?)base.Parent; /// bool IDataTemplateHost.IsDataTemplatesInitialized => _dataTemplates != null; /// void ISetterValue.Initialize(ISetter setter) { throw new InvalidOperationException( "Cannot use a control as a Setter value. Wrap the control in a