예제 #1
0
        public void SetElement(TElement element)
        {
            var oldElement = Element;

            Element = element;

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= _propertyChangedHandler;
            }

            if (element != null)
            {
                if (element.BackgroundColor != Color.Default || (oldElement != null && element.BackgroundColor != oldElement.BackgroundColor))
                {
                    SetBackgroundColor(element.BackgroundColor);
                }

                UpdateClipToBounds();

                if (_tracker == null)
                {
                    _tracker = new VisualElementTracker(this);
                    _tracker.NativeControlUpdated += (sender, e) => UpdateNativeWidget();
                }

                if (AutoPackage && _packager == null)
                {
                    _packager = new VisualElementPackager(this);
                    _packager.Load();
                }

                if (AutoTrack && _events == null)
                {
                    _events = new EventTracker(this);
                    _events.LoadEvents(this);
                }

                element.PropertyChanged += _propertyChangedHandler;
            }

            OnElementChanged(new ElementChangedEventArgs <TElement>(oldElement, element));

            if (element != null)
            {
                SendVisualElementInitialized(element, this);
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (Element != null && !string.IsNullOrEmpty(Element.AutomationId))
            {
                SetAutomationId(Element.AutomationId);
            }
#if __MOBILE__
            SetAccessibilityLabel();
            SetAccessibilityHint();
            SetIsAccessibilityElement();
#endif
        }
        void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            if (disposing)
            {
                EffectUtilities.UnregisterEffectControlProvider(this, Element);

                if (Element != null)
                {
                    Element.PropertyChanged -= OnElementPropertyChanged;
                }

                if (_renderer != null)
                {
                    _renderer.ElementChanged         -= OnElementChanged;
                    _renderer.ElementPropertyChanged -= OnElementPropertyChanged;
                    _renderer = null;
                }

                _gestureManager?.Dispose();
                _automationPropertiesProvider?.Dispose();
            }
        }
예제 #3
0
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element = element;

            FinishedCustomizingViewControllers += HandleFinishedCustomizingViewControllers;
            Tabbed.PropertyChanged             += OnPropertyChanged;
            Tabbed.PagesChanged += OnPagesChanged;

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            OnPagesChanged(null, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));

            if (element != null)
            {
                element.SendViewInitialized(NativeView);
            }

            //disable edit/reorder of tabs
            CustomizableViewControllers = null;

            UpdateBarBackgroundColor();
            UpdateBarBackground();
            UpdateBarTextColor();
            UpdateSelectedTabColors();
            UpdateBarTranslucent();

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
예제 #4
0
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element              = element;
            Element.SizeChanged += PageOnSizeChanged;

            _masterController = new ChildViewController();
            _detailController = new ChildViewController();

            _clickOffView = new UIView();
            _clickOffView.BackgroundColor = new Color(0, 0, 0, 0).ToUIColor();

            Presented = ((MasterDetailPage)Element).IsPresented;

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            // Cannot carry out the invocation below because we do not have access to VisualElement.SendViewInitialized().
            // However, it does not seem to be used at all in the current Xamarin.Forms implementation so we can ignore it here.
            //
            //if (element != null)
            //element.SendViewInitialized(NativeView);
        }
예제 #5
0
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element = element;

            ViewControllers = new[] { _flyoutController = new EventedViewController(), _detailController = new ChildViewController() };

            if (!Forms.IsiOS9OrNewer)
            {
                Delegate = _innerDelegate = new InnerDelegate(FlyoutPage.FlyoutLayoutBehavior);
            }

            UpdateControllers();

            _flyoutController.DidAppear     += FlyoutControllerDidAppear;
            _flyoutController.WillDisappear += FlyoutControllerWillDisappear;

            PresentsWithGesture = FlyoutPage.IsGestureEnabled;
            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (element != null)
            {
                element.SendViewInitialized(NativeView);
            }
        }
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= HandlePropertyChanged;
            }

            Element = element;

            if (Element != null)
            {
                UpdateContent();
                Element.PropertyChanged += HandlePropertyChanged;
            }

            if (!_init)
            {
                _init   = true;
                Tracker = new VisualElementTracker(this);
                SetOnRefreshListener(this);
            }

            UpdateColors();
            UpdateIsRefreshing();
            UpdateIsEnabled();

            ElementChanged?.Invoke(this, new VisualElementChangedEventArgs(oldElement, Element));
            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element = element;

            ViewControllers = new[] {
                _masterController = new EventedViewController(),
                _detailController = new ChildViewController()
            };

            if (!Forms_iOS.IsiOS9OrNewer)
            {
                Delegate = _innerDelegate = new InnerDelegate(MasterDetailPage.MasterBehavior);
            }

            UpdateControllers();

            _masterController.WillAppear    += MasterControllerWillAppear;
            _masterController.WillDisappear += MasterControllerWillDisappear;

            PresentsWithGesture = MasterDetailPage.IsGestureEnabled;
            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
            var sendViewInitializedMethod = typeof(Forms).GetMethod("SendViewInitialized", BindingFlags.Static | BindingFlags.NonPublic);

            sendViewInitializedMethod?.Invoke(null, new object[] { element, NativeView });
        }
예제 #8
0
        protected override void Dispose(bool disposing)
        {
            if (CheckFlagsForDisposed())
            {
                return;
            }

            _flags |= VisualElementRendererFlags.Disposed;

            if (disposing)
            {
                SetOnClickListener(null);
                SetOnTouchListener(null);

                EffectUtilities.UnregisterEffectControlProvider(this, Element);

                if (Tracker != null)
                {
                    Tracker.Dispose();
                    Tracker = null;
                }

                if (_packager != null)
                {
                    _packager.Dispose();
                    _packager = null;
                }

                if (_gestureManager != null)
                {
                    _gestureManager.Dispose();
                    _gestureManager = null;
                }

                if (ManageNativeControlLifetime)
                {
                    int count = ChildCount;
                    for (var i = 0; i < count; i++)
                    {
                        AView child = GetChildAt(i);
                        child.Dispose();
                    }
                }

                if (Element != null)
                {
                    Element.PropertyChanged -= _propertyChangeHandler;

                    if (Platform.GetRenderer(Element) == this)
                    {
                        Platform.SetRenderer(Element, null);
                    }

                    Element = null;
                }
            }

            base.Dispose(disposing);
        }
예제 #9
0
        void IVisualElementRenderer.SetElement(VisualElement element)
        {
            if (element == null)
            {
                throw new ArgumentNullException(nameof(element));
            }

            if (!(element is Button))
            {
                throw new ArgumentException($"{nameof(element)} must be of type {nameof(Button)}");
            }

            VisualElement oldElement = Button;

            Button = (Button)element;

            var reference = Guid.NewGuid().ToString();

            Performance.Start(reference);

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= OnElementPropertyChanged;
            }

            if (_backgroundTracker == null)
            {
                _backgroundTracker = new ButtonBackgroundTracker(Button, this);
            }
            else
            {
                _backgroundTracker.Button = Button;
            }

            Color currentColor = oldElement?.BackgroundColor ?? Color.Default;

            if (element.BackgroundColor != currentColor)
            {
                UpdateBackgroundColor();
            }

            element.PropertyChanged += OnElementPropertyChanged;

            if (_tracker == null)
            {
                // Can't set up the tracker in the constructor because it access the Element (for now)
                SetTracker(new VisualElementTracker(this));
            }

            OnElementChanged(new ElementChangedEventArgs <Button>(oldElement as Button, Button));

            SendVisualElementInitialized(element, this);

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            Performance.Stop(reference);
        }
        public virtual void SetElement(VisualElement element)
        {
            VisualElement oldElement = Element;

            Element = element;

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
예제 #11
0
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= HandlePropertyChanged;
            }

            if (element != null)
            {
                Element = element;
                Element.PropertyChanged += HandlePropertyChanged;

                if (_packager == null)
                {
                    WebView.EvalRequested += OnEvalRequested;
                    WebView.EvaluateJavaScriptRequested += OnEvaluateJavaScriptRequested;
                    WebView.GoBackRequested             += OnGoBackRequested;
                    WebView.GoForwardRequested          += OnGoForwardRequested;
                    WebView.ReloadRequested             += OnReloadRequested;
                    NavigationDelegate = new CustomWebViewNavigationDelegate(this);
                    UIDelegate         = new CustomWebViewUIDelegate();

                    BackgroundColor = UIColor.Clear;

                    AutosizesSubviews = true;

                    _tracker = new VisualElementTracker(this);

                    _packager = new VisualElementPackager(this);
                    _packager.Load();

                    _events = new EventTracker(this);
                    _events.LoadEvents(this);
                }

                Load();
            }

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (Element != null && !string.IsNullOrEmpty(Element.AutomationId))
            {
                AccessibilityIdentifier = Element.AutomationId;
            }

            if (element != null)
            {
                element.SendViewInitialized(this);
            }
        }
예제 #12
0
        void OnElementChanged(ItemsView oldElement, ItemsView newElement)
        {
            TearDownOldElement(oldElement);
            SetUpNewElement(newElement);

            ElementChanged?.Invoke(this, new VisualElementChangedEventArgs(oldElement, newElement));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, newElement);

            UpdateBackgroundColor();
            UpdateFlowDirection();
        }
예제 #13
0
        void IVisualElementRenderer.SetElement(VisualElement element)
        {
            if (element is null)
            {
                throw new ArgumentNullException(nameof(element));
            }

            if (!(element is MediaElement))
            {
                throw new ArgumentException($"{nameof(element)} must be of type {nameof(MediaElement)}");
            }

            MediaElement oldElement = MediaElement;

            MediaElement = (MediaElement)element;

            Performance.Start(out string reference);

            if (oldElement != null)
            {
                UnsubscribeFromEvents(oldElement);
            }

            Color currentColor = oldElement?.BackgroundColor ?? Color.Default;

            if (element.BackgroundColor != currentColor)
            {
                UpdateBackgroundColor();
            }

            if (MediaElement != null)
            {
                MediaElement.PropertyChanged   += OnElementPropertyChanged;
                MediaElement.SeekRequested     += SeekRequested;
                MediaElement.StateRequested    += StateRequested;
                MediaElement.PositionRequested += OnPositionRequested;
            }

            if (_tracker is null)
            {
                // Can't set up the tracker in the constructor because it access the Element (for now)
                SetTracker(new VisualElementTracker(this));
            }

            OnElementChanged(new ElementChangedEventArgs <MediaElement>(oldElement as MediaElement, MediaElement));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            Performance.Stop(reference);
        }
예제 #14
0
        void OnElementChanged(object sender, VisualElementChangedEventArgs e)
        {
            if (e.OldElement != null)
            {
                e.OldElement.PropertyChanged -= OnElementPropertyChanged;
            }

            if (e.NewElement != null)
            {
                e.NewElement.PropertyChanged += OnElementPropertyChanged;
                UpdateBackgroundColor();
            }

            EffectUtilities.RegisterEffectControlProvider(this, e.OldElement, e.NewElement);
        }
예제 #15
0
        public virtual void SetElement(VisualElement element)
        {
            VisualElement oldElement = Element;

            Element = element;

            if (element != null)
            {
                element.PropertyChanged += _propertyChangedHandler;
            }

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
예제 #16
0
        public void SetElement(VisualElement element)
        {
            ScrollView oldElement = _view;

            _view = (ScrollView)element;

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= HandlePropertyChanged;
                oldElement.LayoutChanged   -= HandleLayoutChanged;

                ((IScrollViewController)oldElement).ScrollToRequested -= OnScrollToRequested;
            }
            if (element != null)
            {
                OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

                if (_container == null)
                {
                    Tracker    = new VisualElementTracker(this);
                    _container = new ScrollViewContainer(_view, Context);
                }

                _view.PropertyChanged += HandlePropertyChanged;
                _view.LayoutChanged   += HandleLayoutChanged;

                Controller.ScrollToRequested += OnScrollToRequested;

                LoadContent();
                UpdateBackgroundColor();
                UpdateBackground();
                UpdateOrientation();
                UpdateIsEnabled();
                UpdateHorizontalScrollBarVisibility();
                UpdateVerticalScrollBarVisibility();
                UpdateFlowDirection();

                element.SendViewInitialized(this);

                if (!string.IsNullOrEmpty(element.AutomationId))
                {
                    ContentDescription = element.AutomationId;
                }
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
        void OnElementChanged(object sender, VisualElementChangedEventArgs e)
        {
            Performance.Start(out string reference);
            if (e.OldElement != null)
            {
                e.OldElement.PropertyChanged -= OnElementPropertyChanged;
            }

            if (e.NewElement != null)
            {
                e.NewElement.PropertyChanged += OnElementPropertyChanged;
                UpdateFlowDirection();
                UpdateIsEnabled();
            }

            EffectUtilities.RegisterEffectControlProvider(this, e.OldElement, e.NewElement);
            Performance.Stop(reference);
        }
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element                 = element;
            ViewControllers         = new[] { _masterController = new EventedViewController(), _detailController = new ChildViewController() };
            Delegate                = _innerDelegate = new InnerDelegate(MasterDetailPage.MasterBehavior);
            Element.BackgroundColor = Color.Transparent;
            UpdateControllers();
            _masterController.WillAppear    += MasterControllerWillAppear;
            _masterController.WillDisappear += MasterControllerWillDisappear;
            PresentsWithGesture              = MasterDetailPage.IsGestureEnabled;
            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));
            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
            if (element != null)
            {
                MethodInfo sendViewInitialized = typeof(Xamarin.Forms.Forms).GetMethod("SendViewInitialized", BindingFlags.Static | BindingFlags.NonPublic);
                sendViewInitialized?.Invoke(element, new object[] { element, NativeView });
            }
        }
예제 #19
0
        public void SetElement(VisualElement element)
        {
            VisualElement oldElement = Element;

            Element = element;
            UpdateTitle();

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            if (element != null)
            {
                if (!string.IsNullOrEmpty(element.AutomationId))
                {
                    SetAutomationId(element.AutomationId);
                }

                element.SendViewInitialized(NativeView);

                var parent = Element.Parent;

                while (!Application.IsApplicationOrNull(parent))
                {
                    if (parent is ShellContent)
                    {
                        _isInItems = true;
                    }

                    if (parent is ShellSection shellSection)
                    {
                        _shellSection = shellSection;
                        ((IShellSectionController)_shellSection).AddContentInsetObserver(this);

                        break;
                    }

                    parent = parent.Parent;
                }
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
        public void SetElement(VisualElement element)
        {
            VisualElement oldElement = Element;

            Element = element;
            UpdateTitle();

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            if (Element != null && !string.IsNullOrEmpty(Element.AutomationId))
            {
                SetAutomationId(Element.AutomationId);
            }

            if (element != null)
            {
                element.SendViewInitialized(NativeView);
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element = element;
            UpdateTitle();
            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            if (Element != null && !string.IsNullOrEmpty(Element.AutomationId))
            {
                SetAutomationId(Element.AutomationId);
            }

            if (element != null)
            {
                var sendViewInitialized = typeof(Xamarin.Forms.Forms).GetMethod("SendViewInitialized", BindingFlags.Static | BindingFlags.NonPublic);
                sendViewInitialized?.Invoke(element, new object[] { element, NativeView });
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
예제 #22
0
        protected override void OnElementChanged(ElementChangedEventArgs <WebView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                if (Control == null)
                {
                    try
                    {
                        // On Linux and MacOS use C#/CLI bindings to WebKit/Gtk+: https://github.com/mono/webkit-sharp
                        // On Windows, use the WebBrowser class from System.Windows.Forms.
                        Control = new Controls.WebView();
                    }
                    catch (Exception ex)
                    {
                        Log.Warning("WebView loading", $"WebView load failed: {ex}");
                    }

                    SetNativeControl(Control);

                    if (Control != null)
                    {
                        Control.LoadStarted  += OnLoadStarted;
                        Control.LoadFinished += OnLoadFinished;
                    }

                    WebViewController.EvalRequested += OnEvalRequested;
                    WebViewController.EvaluateJavaScriptRequested += OnEvaluateJavaScriptRequested;
                    WebViewController.GoBackRequested             += OnGoBackRequested;
                    WebViewController.GoForwardRequested          += OnGoForwardRequested;
                    WebViewController.ReloadRequested             += OnReloadRequested;
                }
            }

            Load();

            EffectUtilities.RegisterEffectControlProvider(this, e.OldElement, e.NewElement);
        }
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element = element;

            Tabbed.PropertyChanged += OnPropertyChanged;
            Tabbed.PagesChanged    += OnPagesChanged;

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            OnPagesChanged(null, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));

            if (element != null)
            {
                element.SendViewInitialized(NativeView);
            }

            //UpdateBarBackgroundColor();
            //UpdateBarTextColor();
            // UpdateBarIndicatorColor();

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
        }
예제 #24
0
        public void SetElement(VisualElement element)
        {
            var oldElement = Element;

            Element              = element;
            Element.SizeChanged += PageOnSizeChanged;

            _flyoutController = new ChildViewController();
            _detailController = new ChildViewController();

            _clickOffView = new UIView();
            _clickOffView.BackgroundColor = new Color(0, 0, 0, 0).ToUIColor();

            Presented = ((FlyoutPage)Element).IsPresented;

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (element != null)
            {
                element.SendViewInitialized(NativeView);
            }
        }
예제 #25
0
        public void SetElement(TElement element)
        {
            TElement oldElement = Element;

            Element = element ?? throw new ArgumentNullException(nameof(element));

            Performance.Start(out string reference);

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= _propertyChangeHandler;
            }

            Color currentColor = oldElement?.BackgroundColor ?? Color.Default;

            if (element.BackgroundColor != currentColor)
            {
                UpdateBackgroundColor();
            }

            if (element.Background != null)
            {
                UpdateBackground();
            }

            if (_propertyChangeHandler == null)
            {
                _propertyChangeHandler = OnElementPropertyChanged;
            }

            element.PropertyChanged += _propertyChangeHandler;

            if (oldElement == null)
            {
                SoundEffectsEnabled = false;
            }

            OnElementChanged(new ElementChangedEventArgs <TElement>(oldElement, element));

            if (AutoPackage && _packager == null)
            {
                SetPackager(new VisualElementPackager(this));
            }

            if (AutoTrack && Tracker == null)
            {
                SetTracker(new VisualElementTracker(this));
            }

            if (oldElement != null)
            {
                Tracker?.UpdateLayout();
            }

            if (element != null)
            {
                SendVisualElementInitialized(element, this);
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (!string.IsNullOrEmpty(element.AutomationId))
            {
                SetAutomationId(element.AutomationId);
            }

            SetContentDescription();
            SetFocusable();
            UpdateInputTransparent();
            UpdateInputTransparentInherited();
            UpdateTabStop();
            UpdateTabIndex();

            Performance.Stop(reference);
        }
예제 #26
0
        public void SetElement(VisualElement element)
        {
            _requestedScroll = null;
            var oldElement = Element;

            Element = element;

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= HandlePropertyChanged;
                ((ScrollView)oldElement).ScrollToRequested -= OnScrollToRequested;
            }

            if (element != null)
            {
                element.PropertyChanged += HandlePropertyChanged;
                ((ScrollView)element).ScrollToRequested += OnScrollToRequested;
                if (_packager == null)
                {
                    _packager = new VisualElementPackager(this);
                    _packager.Load();

                    _tracker = new VisualElementTracker(this);
                    _tracker.NativeControlUpdated += OnNativeControlUpdated;
                    _events = new EventTracker(this);
                    _events.LoadEvents(this);


                    _insetTracker = new KeyboardInsetTracker(this, () => Window, insets =>
                    {
                        ContentInset = ScrollIndicatorInsets = insets;
                    },
                                                             point =>
                    {
                        var offset = ContentOffset;
                        offset.Y  += point.Y;
                        SetContentOffset(offset, true);
                    }, this);
                }

                UpdateDelaysContentTouches();
                UpdateContentSize();
                UpdateBackgroundColor();
                UpdateBackground();
                UpdateIsEnabled();
                UpdateVerticalScrollBarVisibility();
                UpdateHorizontalScrollBarVisibility();

                OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

                EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

                if (element != null)
                {
                    element.SendViewInitialized(this);
                }

                if (!string.IsNullOrEmpty(element.AutomationId))
                {
                    AccessibilityIdentifier = element.AutomationId;
                }
            }
        }
예제 #27
0
        public void SetElement(TElement element)
        {
            var oldElement = Element;

            Element = element;

            Performance.Start(out string reference);

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= _propertyChangedHandler;
            }

            if (element != null)
            {
                if (element.BackgroundColor != null || (oldElement != null && element.BackgroundColor != oldElement.BackgroundColor))
                {
                    SetBackgroundColor(element.BackgroundColor);
                }

                if (element.Background != null && (!element.Background.IsEmpty || (oldElement != null && element.Background != oldElement.Background)))
                {
                    SetBackground(element.Background);
                }

                UpdateClipToBounds();

                if (_tracker == null)
                {
                    _tracker = new VisualElementTracker(this);
                    _tracker.NativeControlUpdated += (sender, e) => UpdateNativeWidget();
                }

                if (AutoPackage && _packager == null)
                {
                    _packager = new VisualElementPackager(this);
                    _packager.Load();
                }


                // TODO MAUI AUTOTRACK?
                if (AutoTrack && _events == null)
                {
                    // _events = new EventTracker(this);
                    //_events.LoadEvents(this);
                }

                element.PropertyChanged += _propertyChangedHandler;
            }

            OnElementChanged(new ElementChangedEventArgs <TElement>(oldElement, element));

            if (element != null)
            {
                SendVisualElementInitialized(element, this);
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (Element != null && !string.IsNullOrEmpty(Element.AutomationId))
            {
                SetAutomationId(Element.AutomationId);
            }

            if (element != null)
            {
                SetAccessibilityLabel();
            }

            SetAccessibilityHint();
            SetIsAccessibilityElement();
            SetAccessibilityElementsHidden();
            Performance.Stop(reference);
        }
예제 #28
0
 void OnElementChanged(ItemsView oldElement, ItemsView newElement)
 {
     ElementChanged?.Invoke(this, new VisualElementChangedEventArgs(oldElement, newElement));
     EffectUtilities.RegisterEffectControlProvider(this, oldElement, newElement);
     OnElementChanged(new ElementChangedEventArgs <ItemsView>(oldElement, newElement));
 }
예제 #29
0
        void IVisualElementRenderer.SetElement(VisualElement element)
        {
            if (element == null)
            {
                throw new ArgumentNullException(nameof(element));
            }

            if (!(element is Entry))
            {
                throw new ArgumentException($"{nameof(element)} must be of type {nameof(Entry)}");
            }

            VisualElement oldElement = Entry;

            Entry = (Entry)element;

            Performance.Start(out string reference);

            if (oldElement != null)
            {
                oldElement.PropertyChanged      -= OnElementPropertyChanged;
                oldElement.FocusChangeRequested -= OnFocusChangeRequested;
            }

            if (oldElement == null)
            {
                _textInputEditText = new MaterialFormsEditText(Context);
                AddView(_textInputEditText);

                _textInputEditText.FocusChange += _textInputEditText_FocusChange;
                Hint = Entry.Placeholder;

                _textInputEditText.AddTextChangedListener(this);
                _textInputEditText.SetOnEditorActionListener(this);
                _textInputEditText.OnKeyboardBackPressed += OnKeyboardBackPressed;
                _textInputEditText.SelectionChanged      += SelectionChanged;

                var useLegacyColorManagement = Entry.UseLegacyColorManagement();

                _textColorSwitcher = new TextColorSwitcher(_textInputEditText.TextColors, useLegacyColorManagement);
                _hintColorSwitcher = new TextColorSwitcher(_textInputEditText.HintTextColors, useLegacyColorManagement);
            }

            // When we set the control text, it triggers the SelectionChanged event, which updates CursorPosition and SelectionLength;
            // These one-time-use variables will let us initialize a CursorPosition and SelectionLength via ctor/xaml/etc.
            _cursorPositionChangePending  = Element.IsSet(Entry.CursorPositionProperty);
            _selectionLengthChangePending = Element.IsSet(Entry.SelectionLengthProperty);


            Hint = Entry.Placeholder;
            _textInputEditText.Text = Entry.Text;
            UpdateInputType();
            UpdateColor();
            UpdateAlignment();
            UpdateFont();
            UpdatePlaceholderColor(true);
            UpdateMaxLength();
            UpdateImeOptions();
            UpdateReturnType();
            UpdateBackgroundColor();

            if (_cursorPositionChangePending || _selectionLengthChangePending)
            {
                UpdateCursorSelection();
            }

            element.PropertyChanged += OnElementPropertyChanged;
            if (_tracker == null)
            {
                _tracker = new VisualElementTracker(this);
            }
            element.SendViewInitialized(this);
            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);
            Performance.Stop(reference);
            ElementChanged?.Invoke(this, new VisualElementChangedEventArgs(oldElement, element));

            element.FocusChangeRequested += OnFocusChangeRequested;
        }
예제 #30
0
        public void SetElement(TElement element)
        {
            if (element == null)
            {
                throw new ArgumentNullException(nameof(element));
            }

            TElement oldElement = Element;

            Element = element;

            Performance.Start();

            if (oldElement != null)
            {
                oldElement.PropertyChanged -= _propertyChangeHandler;
            }

            // element may be allowed to be passed as null in the future
            if (element != null)
            {
                Color currentColor = oldElement != null ? oldElement.BackgroundColor : Color.Default;
                if (element.BackgroundColor != currentColor)
                {
                    UpdateBackgroundColor();
                }
            }

            if (_propertyChangeHandler == null)
            {
                _propertyChangeHandler = OnElementPropertyChanged;
            }

            element.PropertyChanged += _propertyChangeHandler;

            if (oldElement == null)
            {
                SoundEffectsEnabled = false;
            }

            OnElementChanged(new ElementChangedEventArgs <TElement>(oldElement, element));

            if (AutoPackage && _packager == null)
            {
                SetPackager(new VisualElementPackager(this));
            }

            if (AutoTrack && Tracker == null)
            {
                SetTracker(new VisualElementTracker(this));
            }

            if (element != null)
            {
                SendVisualElementInitialized(element, this);
            }

            EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            if (element != null && !string.IsNullOrEmpty(element.AutomationId))
            {
                SetAutomationId(element.AutomationId);
            }

            SetContentDescription();
            SetFocusable();
            UpdateInputTransparent();

            Performance.Stop();
        }