public CompositionImage() { this.DefaultStyleKey = typeof(CompositionImage); this.Background = new SolidColorBrush(Colors.Transparent); this._stretchMode = CompositionStretch.Uniform; this.Loading += CompImage_Loading; this.Unloaded += CompImage_Unloaded; this.SizeChanged += CompImage_SizeChanged; _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; // Intialize the statics as needed if (!_staticsInitialized) { _defaultPlaceholderBrush = _compositor.CreateColorBrush(Colors.DarkGray); TimeSpan duration = TimeSpan.FromMilliseconds(1000); _fadeOutAnimation = _compositor.CreateScalarKeyFrameAnimation(); _fadeOutAnimation.InsertKeyFrame(0, 1); _fadeOutAnimation.InsertKeyFrame(1, 0); _fadeOutAnimation.Duration = duration; _scaleAnimation = _compositor.CreateVector2KeyFrameAnimation(); _scaleAnimation.InsertKeyFrame(0, new Vector2(1.25f, 1.25f)); _scaleAnimation.InsertKeyFrame(1, new Vector2(1, 1)); _scaleAnimation.Duration = duration; _staticsInitialized = true; } // Initialize the surface loader if needed if (!SurfaceLoader.IsInitialized) { SurfaceLoader.Initialize(ElementCompositionPreview.GetElementVisual(this).Compositor); } _placeholderDelay = TimeSpan.FromMilliseconds(50); _surfaceBrush = _compositor.CreateSurfaceBrush(null); }
private async void LoadSurface() { // If we're clearing out the content, return if (_uri == null) { ReleaseSurface(); return; } try { // Start a timer to enable the placeholder image if requested if (_surface == null && _placeholderDelay >= TimeSpan.Zero) { _timer = new DispatcherTimer(); _timer.Interval = _placeholderDelay; _timer.Tick += Timer_Tick; _timer.Start(); } // Load the image asynchronously CompositionDrawingSurface surface = await SurfaceLoader.LoadFromUri(_uri, Size.Empty, _loadEffectDelegate); if (_surface != null) { ReleaseSurface(); } _surface = surface; // The surface has changed, so we need to re-measure with the new surface dimensions InvalidateMeasure(); // Async operations may take a while. If we've unloaded, return now. if (_unloaded) { ReleaseSurface(); return; } // Update the brush UpdateBrush(); // Success, fire the Opened event if (ImageOpened != null) { ImageOpened(this, null); } // // If we created the loading placeholder, now that the image has loaded // cross-fade it out. // if (_sprite != null && _sprite.Children.Count > 0) { Debug.Assert(_timer == null); StartCrossFade(); } else if (_timer != null) { // We didn't end up loading the placeholder, so just stop the timer _timer.Stop(); _timer = null; } } catch (FileNotFoundException) { if (ImageFailed != null) { ImageFailed(this, null); } } }