private static void AutoLayoutContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { VisualBrush target = ((VisualBrush)d); target.PropertyChanged(AutoLayoutContentProperty); }
//------------------------------------------------------ // // Public Properties // //------------------------------------------------------ private static void VisualPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { VisualBrush target = ((VisualBrush)d); Visual oldV = (Visual)e.OldValue; // // If the Visual required layout but it is changed before we do Layout // on that Visual, then we dont want the async LayoutCallback method to run, // nor do we want the LayoutUpdated handler to run. So we abort/remove them. // if (target._pendingLayout) { // // Visual has to be a UIElement since _pendingLayout flag is // true only if we added the LayoutUpdated handler which can // only be done on UIElement. // UIElement element = (UIElement)oldV; Debug.Assert(element != null); element.LayoutUpdated -= target.OnLayoutUpdated; Debug.Assert(target._DispatcherLayoutResult != null); Debug.Assert(target._DispatcherLayoutResult.Status == System.Windows.Threading.DispatcherOperationStatus.Pending); bool abortStatus = target._DispatcherLayoutResult.Abort(); Debug.Assert(abortStatus); target._pendingLayout = false; } Visual newV = (Visual)e.NewValue; System.Windows.Threading.Dispatcher dispatcher = target.Dispatcher; if (dispatcher != null) { DUCE.IResource targetResource = (DUCE.IResource)target; using (CompositionEngineLock.Acquire()) { int channelCount = targetResource.GetChannelCount(); for (int channelIndex = 0; channelIndex < channelCount; channelIndex++) { DUCE.Channel channel = targetResource.GetChannel(channelIndex); Debug.Assert(!channel.IsOutOfBandChannel); Debug.Assert(!targetResource.GetHandle(channel).IsNull); target.ReleaseResource(oldV, channel); target.AddRefResource(newV, channel); } } } target.PropertyChanged(VisualProperty); }