protected override void OnAttached()
        {
            base.OnAttached();

            try
            {
                RegisterPropertyChangedAndSaveUnregToken(
                    IsInputEnabledProperty,
                    (o, a) => this.InkPresenter.IsInputEnabled = IsInputEnabled);

                RegisterPropertyChangedAndSaveUnregToken(
                    InputDeviceTypesProperty,
                    (o, a) => this.InkPresenter.InputDeviceTypes = InputDeviceTypes);

                DependencyPropertyChangedCallback detailChanged = (o, a) =>
                {
                    InkPresenter.InputProcessingConfiguration.Mode = CurrentProfile == InkCanvasProfileType.Erasing ? InkInputProcessingMode.Erasing : InkInputProcessingMode.Inking;
                    var att = InkPresenter.CopyDefaultDrawingAttributes();
                    att.Color             = Color;
                    att.PenTip            = PenShape;
                    att.IgnorePressure    = false;
                    att.DrawAsHighlighter = CurrentProfile == InkCanvasProfileType.Highlighting;
                    att.Size = StrokeSize;
                    InkPresenter.UpdateDefaultDrawingAttributes(att);
                };

                RegisterPropertyChangedAndSaveUnregToken(ColorProperty, detailChanged);
                RegisterPropertyChangedAndSaveUnregToken(StrokeSizeProperty, detailChanged);
                RegisterPropertyChangedAndSaveUnregToken(CurrentProfileProperty, (o, a) =>
                {
                    switch (CurrentProfile)
                    {
                    case InkCanvasProfileType.Drawing:
                        ProfileOfDrawing?.ApplyToInkCanvasController(this);
                        break;

                    case InkCanvasProfileType.Highlighting:
                        ProfileOfHighlighting?.ApplyToInkCanvasController(this);
                        break;

                    case InkCanvasProfileType.Erasing:
                        ProfileOfErasing?.ApplyToInkCanvasController(this);
                        break;

                    default:
                        break;
                    }
                    detailChanged(o, a);
                });
                RegisterPropertyChangedAndSaveUnregToken(PenShapeProperty, detailChanged);


                regs.ForEach(i => i.Item3(null, null));
            }
            catch (Exception ex)
            {
                EventRouter.Instance.RaiseEvent(this, ex);
            }
        }
        public IObservable<IObservedChange<object, object>> GetNotificationForProperty(object sender, System.Linq.Expressions.Expression expression, bool beforeChanged = false)
        {
            Contract.Requires(sender != null && sender is DependencyObject);
            var type = sender.GetType();
            var propertyName = expression.GetMemberInfo().Name;
            var depSender = sender as DependencyObject;

            if (depSender == null)
            {
                this.Log().Warn("Tried to bind DP on a non-DependencyObject. Binding as POCO object",
                    type.FullName, propertyName);

                var ret = new POCOObservableForProperty();
                return ret.GetNotificationForProperty(sender, expression, beforeChanged);
            }

            if (beforeChanged == true) {
                this.Log().Warn("Tried to bind DO {0}.{1}, but DPs can't do beforeChanged. Binding as POCO object",
                    type.FullName, propertyName);

                var ret = new POCOObservableForProperty();
                return ret.GetNotificationForProperty(sender, expression, beforeChanged);
            }

            var dpFetcher = getDependencyPropertyFetcher(type, propertyName);
            if (dpFetcher == null) {
                this.Log().Warn("Tried to bind DO {0}.{1}, but DP doesn't exist. Binding as POCO object",
                    type.FullName, propertyName);

                var ret = new POCOObservableForProperty();
                return ret.GetNotificationForProperty(sender, expression, beforeChanged);
            }

#if WINDOWS_UWP
            return Observable.Create<IObservedChange<object, object>>(subj => {
                var handler = new DependencyPropertyChangedCallback((o, e) => {
                    subj.OnNext(new ObservedChange<object, object>(sender, expression));
                });
                var dependencyProperty = dpFetcher();
                var token = depSender.RegisterPropertyChangedCallback(dependencyProperty, handler);
                return Disposable.Create(() => depSender.UnregisterPropertyChangedCallback(dependencyProperty, token));
            });
#else
            var dpAndSubj = createAttachedProperty(type, propertyName);

            return Observable.Create<IObservedChange<object, object>>(obs => {
                BindingOperations.SetBinding(depSender, dpAndSubj.Item1,
                    new Binding() { Source = depSender, Path = new PropertyPath(propertyName) });

                var disp = dpAndSubj.Item2
                    .Where(x => x == sender)
                    .Select(x => new ObservedChange<object, object>(x, expression))
                    .Subscribe(obs);

                // ClearBinding calls ClearValue http://stackoverflow.com/questions/1639219/clear-binding-in-silverlight-remove-data-binding-from-setbinding
                return new CompositeDisposable(Disposable.Create(() => depSender.ClearValue(dpAndSubj.Item1)), disp);
            });
#endif
        }
Ejemplo n.º 3
0
        /// <inheritdoc/>
        public IObservable <IObservedChange <object, object> > GetNotificationForProperty(object sender, System.Linq.Expressions.Expression expression, string propertyName, bool beforeChanged = false, bool suppressWarnings = false)
        {
            Contract.Requires(sender != null && sender is DependencyObject);
            var type      = sender.GetType();
            var depSender = sender as DependencyObject;

            if (depSender == null)
            {
                if (!suppressWarnings)
                {
                    this.Log().Warn(
                        CultureInfo.InvariantCulture,
                        "Tried to bind DP on a non-DependencyObject. Binding as POCO object",
                        type.FullName,
                        propertyName);
                }

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged));
            }

            if (beforeChanged == true)
            {
                this.Log().Warn(
                    CultureInfo.InvariantCulture,
                    "Tried to bind DO {0}.{1}, but DPs can't do beforeChanged. Binding as POCO object",
                    type.FullName,
                    propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged));
            }

            var dpFetcher = GetDependencyPropertyFetcher(type, propertyName);

            if (dpFetcher == null)
            {
                this.Log().Warn(
                    CultureInfo.InvariantCulture,
                    "Tried to bind DO {0}.{1}, but DP doesn't exist. Binding as POCO object",
                    type.FullName,
                    propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged));
            }

            return(Observable.Create <IObservedChange <object, object> >(subj =>
            {
                var handler = new DependencyPropertyChangedCallback((o, e) =>
                {
                    subj.OnNext(new ObservedChange <object, object>(sender, expression));
                });
                var dependencyProperty = dpFetcher();
                var token = depSender.RegisterPropertyChangedCallback(dependencyProperty, handler);
                return Disposable.Create(() => depSender.UnregisterPropertyChangedCallback(dependencyProperty, token));
            }));
        }
Ejemplo n.º 4
0
        public static ThemeChangedCallbackToken RegisterAppThemeChangedCallback(DependencyPropertyChangedCallback callback)
        {
            Frame rootFrame = Window.Current.Content as Frame;
            long  token     = rootFrame.RegisterPropertyChangedCallback(Frame.RequestedThemeProperty, callback);

            return(new ThemeChangedCallbackToken {
                RootFrame = new WeakReference(rootFrame), Token = token
            });
        }
        /// <inheritdoc/>
        public IObservable <IObservedChange <object, object> >?GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged = false, bool suppressWarnings = false)
        {
            if (sender == null)
            {
                throw new ArgumentNullException(nameof(sender));
            }

            var depSender = sender as DependencyObject;

            if (depSender == null)
            {
                throw new ArgumentException("The sender must be a DependencyObject", nameof(sender));
            }

            var type = sender.GetType();

            if (beforeChanged)
            {
                this.Log().Warn(
                    CultureInfo.InvariantCulture,
                    "Tried to bind DO {0}.{1}, but DPs can't do beforeChanged. Binding as POCO object",
                    type.FullName,
                    propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged));
            }

            var dpFetcher = GetDependencyPropertyFetcher(type, propertyName);

            if (dpFetcher == null)
            {
                this.Log().Warn(
                    CultureInfo.InvariantCulture,
                    "Tried to bind DO {0}.{1}, but DP doesn't exist. Binding as POCO object",
                    type.FullName,
                    propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged));
            }

            return(Observable.Create <IObservedChange <object, object> >(subj =>
            {
                var handler = new DependencyPropertyChangedCallback((o, e) =>
                {
                    subj.OnNext(new ObservedChange <object, object>(sender, expression));
                });
                var dependencyProperty = dpFetcher();
                var token = depSender.RegisterPropertyChangedCallback(dependencyProperty, handler);
                return Disposable.Create(() => depSender.UnregisterPropertyChangedCallback(dependencyProperty, token));
            }));
        }
        /// <summary>
        /// Observe DependencyProperty
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="self"></param>
        /// <param name="dp"></param>
        /// <returns></returns>
        public static IObservable <Unit> ObserveDependencyProperty <T>(this T self, DependencyProperty dp)
            where T : DependencyObject
        {
            return(Observable.Create <Unit>(ox =>
            {
#if WINDOWS_UWP
                DependencyPropertyChangedCallback h = (_, __) => ox.OnNext(Unit.Default);
                var token = self.RegisterPropertyChangedCallback(dp, h);
                return () => self.UnregisterPropertyChangedCallback(dp, token);
#else
                EventHandler h = (_, __) => ox.OnNext(Unit.Default);
                var descriptor = DependencyPropertyDescriptor.FromProperty(dp, typeof(T));
                descriptor.AddValueChanged(self, h);
                return () => descriptor.RemoveValueChanged(self, h);
#endif
            }));
        }
Ejemplo n.º 7
0
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            var rowSpan = container.GetValue(VariableSizedWrapGrid.RowSpanProperty);

            int index;

            try
            {
                dynamic model = item;
                index = model.Index;
            }
            catch (Exception)
            {
                index = -1;
            }
            long token = 0;

            DependencyPropertyChangedCallback lambda = (sender, dp) =>
            {
                container.UnregisterPropertyChangedCallback(VariableSizedWrapGrid.RowSpanProperty, token);

                var cp = (ContentControl)container;
                cp.ContentTemplateSelector = null;
                cp.ContentTemplateSelector = this;
            };

            token = container.RegisterPropertyChangedCallback(VariableSizedWrapGrid.RowSpanProperty, lambda);

            switch (rowSpan)
            {
            case 1:
                return(Small);

            case 2:
                return(Medium);

            case 3:
                return(Large);

            default:
                throw new InvalidOperationException( );
            }
        }
        /// <summary>
        /// Converts a DependencyProperty to an IObservable.
        /// </summary>
        /// <typeparam name="T">The Type of the component that owns the DependencyProperty.</typeparam>
        /// <param name="self">The element that owns the DependencyProperty.</param>
        /// <param name="dp">The DependencyProperty to "observe".</param>
        /// <returns>An Iobservable of the changes of the DependencyProperty.</returns>
        internal static IObservable <Unit> Observe <T>(this T self, DependencyProperty dp)
            where T : DependencyObject
        {
            return(Observable.Create <Unit>(observer =>
            {
#if __WPF__
                EventHandler handler = (_, __) => observer.OnNext(Unit.Default);
                var descriptor = DependencyPropertyDescriptor.FromProperty(dp, typeof(T));
                descriptor.AddValueChanged(self, handler);

                return () => descriptor.RemoveValueChanged(self, handler);
#else
                DependencyPropertyChangedCallback handler = (_, __) => observer.OnNext(Unit.Default);
                var token = self.RegisterPropertyChangedCallback(dp, handler);

                return () => self.UnregisterPropertyChangedCallback(dp, token);
#endif
            }));
        }
Ejemplo n.º 9
0
        public IObservable <IObservedChange <object, object> > GetNotificationForProperty(object sender, System.Linq.Expressions.Expression expression, bool beforeChanged = false)
        {
            Contract.Requires(sender != null && sender is DependencyObject);
            var type         = sender.GetType();
            var propertyName = expression.GetMemberInfo().Name;
            var depSender    = sender as DependencyObject;

            if (depSender == null)
            {
                this.Log().Warn("Tried to bind DP on a non-DependencyObject. Binding as POCO object",
                                type.FullName, propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, beforeChanged));
            }

            if (beforeChanged == true)
            {
                this.Log().Warn("Tried to bind DO {0}.{1}, but DPs can't do beforeChanged. Binding as POCO object",
                                type.FullName, propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, beforeChanged));
            }

            var dpFetcher = getDependencyPropertyFetcher(type, propertyName);

            if (dpFetcher == null)
            {
                this.Log().Warn("Tried to bind DO {0}.{1}, but DP doesn't exist. Binding as POCO object",
                                type.FullName, propertyName);

                var ret = new POCOObservableForProperty();
                return(ret.GetNotificationForProperty(sender, expression, beforeChanged));
            }

#if WINDOWS_UWP
            return(Observable.Create <IObservedChange <object, object> >(subj => {
                var handler = new DependencyPropertyChangedCallback((o, e) => {
                    subj.OnNext(new ObservedChange <object, object>(sender, expression));
                });
                var dependencyProperty = dpFetcher();
                var token = depSender.RegisterPropertyChangedCallback(dependencyProperty, handler);
                return Disposable.Create(() => depSender.UnregisterPropertyChangedCallback(dependencyProperty, token));
            }));
#else
            var dpAndSubj = createAttachedProperty(type, propertyName);

            return(Observable.Create <IObservedChange <object, object> >(obs => {
                BindingOperations.SetBinding(depSender, dpAndSubj.Item1,
                                             new Binding()
                {
                    Source = depSender, Path = new PropertyPath(propertyName)
                });

                var disp = dpAndSubj.Item2
                           .Where(x => x == sender)
                           .Select(x => new ObservedChange <object, object>(x, expression))
                           .Subscribe(obs);

                // ClearBinding calls ClearValue http://stackoverflow.com/questions/1639219/clear-binding-in-silverlight-remove-data-binding-from-setbinding
                return new CompositeDisposable(Disposable.Create(() => depSender.ClearValue(dpAndSubj.Item1)), disp);
            }));
#endif
        }
Ejemplo n.º 10
0
        public static void RegisterPropertyChangedCallback(this FrameworkElement element, DependencyProperty dp, DependencyPropertyChangedCallback callback)
        {
            if (element.IsVisible)
            {
                DependencyPropertyDescriptor.FromProperty(dp, element.GetType()).AddValueChanged(element, OnValueChanged);
            }

            element.IsVisibleChanged += OnIsVisibleChanged;

            void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
            {
                if ((bool)e.NewValue)
                {
                    DependencyPropertyDescriptor.FromProperty(dp, element.GetType()).AddValueChanged(element, OnValueChanged);
                }
                else
                {
                    DependencyPropertyDescriptor.FromProperty(dp, element.GetType()).RemoveValueChanged(element, OnValueChanged);
                }
            }

            void OnValueChanged(object sender, EventArgs e)
            {
                callback((DependencyObject)sender, dp);
            }
        }
        private void RegisterPropertyChangedAndSaveUnregToken(DependencyProperty dp, DependencyPropertyChangedCallback callback)
        {
            var regv = RegisterPropertyChangedCallback(dp, callback);

            regs.Add(Tuple.Create(dp, regv, callback));
        }
Ejemplo n.º 12
0
 public PropertyMetadata(CreateDefaultValueCallback createDefaultValueCallback, DependencyPropertyChangedCallback propertyChangedCallback = null, bool isInherited = false)
 {
     this.createDefaultValueCallback = createDefaultValueCallback;
     this.PropertyChangedCallback    = propertyChangedCallback;
     this.IsInherited = isInherited;
 }
Ejemplo n.º 13
0
 public PropertyMetadata(object defaultValue, DependencyPropertyChangedCallback propertyChangedCallback = null, bool isInherited = false)
 {
     this.defaultValue            = defaultValue;
     this.PropertyChangedCallback = propertyChangedCallback;
     this.IsInherited             = isInherited;
 }