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 }
/// <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)); })); }
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 })); }
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 })); }
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 }
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)); }
public PropertyMetadata(CreateDefaultValueCallback createDefaultValueCallback, DependencyPropertyChangedCallback propertyChangedCallback = null, bool isInherited = false) { this.createDefaultValueCallback = createDefaultValueCallback; this.PropertyChangedCallback = propertyChangedCallback; this.IsInherited = isInherited; }
public PropertyMetadata(object defaultValue, DependencyPropertyChangedCallback propertyChangedCallback = null, bool isInherited = false) { this.defaultValue = defaultValue; this.PropertyChangedCallback = propertyChangedCallback; this.IsInherited = isInherited; }