protected override void OnWindowPositionChanged(Rect rcBoundingBox) { base.OnWindowPositionChanged(rcBoundingBox); if (ParentScrollViewer == null) { return; } GeneralTransform tr = RootVisual.TransformToDescendant(ParentScrollViewer); var scrollRect = new Rect(new Size(ParentScrollViewer.ViewportWidth, ParentScrollViewer.ViewportHeight)); var intersect = Rect.Intersect(scrollRect, tr.TransformBounds(rcBoundingBox)); if (!intersect.IsEmpty) { tr = ParentScrollViewer.TransformToDescendant(this); intersect = tr.TransformBounds(intersect); } else { intersect = new Rect(); } int x1 = (int)Math.Round(intersect.Left); int y1 = (int)Math.Round(intersect.Top); int x2 = (int)Math.Round(intersect.Right); int y2 = (int)Math.Round(intersect.Bottom); SetRegion(x1, y1, x2, y2); }
protected override void OnWindowPositionChanged(Rect rcBoundingBox) { base.OnWindowPositionChanged(rcBoundingBox); if (ParentScrollViewer == null) { return; } try { GeneralTransform tr = ParentScrollViewer.TransformToAncestor(MainWindow); var scrollRect = new Rect(new Size(ParentScrollViewer.ViewportWidth, ParentScrollViewer.ViewportHeight)); scrollRect = tr.TransformBounds(scrollRect); var intersect = Rect.Intersect(scrollRect, rcBoundingBox); if (!intersect.IsEmpty) { tr = MainWindow.TransformToDescendant(this); intersect = tr.TransformBounds(intersect); } SetRegion(intersect); } catch (Exception e) { Console.WriteLine($"{e.GetType().ToString()}: {e.Message}"); } }
void ProcessExpandAnimation() { if (StartTime == null) { return; } var startTime = StartTime.Value; var elapsedTime = DateTime.Now.Subtract(startTime); if (elapsedTime < TimeSpan.Zero) { return; } var totalDuration = Duration; if (elapsedTime < totalDuration && this.IsVisible) { var normalizedTime = (Double)elapsedTime.Ticks / (Double)totalDuration.Ticks; var easing = (EasingFunction == null ? normalizedTime // if there is no easing function, use linear animation. : EasingFunction.Ease(normalizedTime)); if (InitialSize != null && FinalSize != null) { var currentWidth = InitialSize.Value.Width + ((FinalSize.Value.Width - InitialSize.Value.Width) * easing); var currentHeight = InitialSize.Value.Height + ((FinalSize.Value.Height - InitialSize.Value.Height) * easing); CurrentSize = new Size(currentWidth, currentHeight); } if (InitialVerticalOffset != null && FinalVerticalOffset != null) { var currentVerticalOffset = InitialVerticalOffset.Value + ((FinalVerticalOffset.Value - InitialVerticalOffset.Value) * easing); ParentScrollViewer.ScrollToVerticalOffset(currentVerticalOffset); } } else { CurrentSize = FinalSize.Value; if (ParentScrollViewer != null && FinalVerticalOffset != null) { ParentScrollViewer.ScrollToVerticalOffset(FinalVerticalOffset.Value); InitialVerticalOffset = null; FinalVerticalOffset = null; } StartTime = null; InitialSize = null; FinalSize = null; } }
protected override void OnWindowPositionChanged(Rect rcBoundingBox) { if (_lastBoundingBox.Equals(rcBoundingBox)) { return; } _lastBoundingBox = rcBoundingBox; Graphics g = this.Child.CreateGraphics(); double xScale = g.DpiX / 96.0; double yScale = g.DpiY / 96.0; base.OnWindowPositionChanged(rcBoundingBox); //rcBoundingBox = new Rect(new Point(rcBoundingBox.X, rcBoundingBox.Y), new Size( rcBoundingBox.Width, rcBoundingBox.Height)); if (ParentScrollViewer == null && !TryFindScrollViewer()) { return; } GeneralTransform tr = ParentScrollViewer.TransformToAncestor(MainWindow); var scrollRect = new Rect(new Size(ParentScrollViewer.ViewportWidth, ParentScrollViewer.ViewportHeight)); scrollRect = tr.TransformBounds(scrollRect); scrollRect = new Rect(new Point(scrollRect.X * xScale, scrollRect.Y * yScale), new Size(scrollRect.Width * xScale, scrollRect.Height * yScale)); var intersect = Rect.Intersect(scrollRect, rcBoundingBox); if (intersect.Equals(rcBoundingBox)) { if (!_fullyIntersect) { InvalidateVisual(); } _fullyIntersect = true; } else { _fullyIntersect = false; } if (!intersect.IsEmpty) { tr = MainWindow.TransformToDescendant(this); intersect = new Rect(new Point(intersect.X / xScale, intersect.Y / yScale), new Size(intersect.Width / xScale, intersect.Height / yScale)); intersect = tr.TransformBounds(intersect); intersect = new Rect(new Point(intersect.X * xScale, intersect.Y * yScale), new Size(intersect.Width * xScale, intersect.Height * yScale)); //InvalidateVisual(); } SetRegion(intersect); }
protected override void OnWindowPositionChanged(Rect rcBoundingBox) { DpiScale dpiScale = VisualTreeHelper.GetDpi(this); base.OnWindowPositionChanged(rcBoundingBox); Rect newRect = ScaleRectDownFromDPI(rcBoundingBox, dpiScale); Rect finalRect; if (ParentScrollViewer != null) { ParentScrollViewer.ScrollChanged += ParentScrollViewer_ScrollChanged; ParentScrollViewer.SizeChanged += ParentScrollViewer_SizeChanged; ParentScrollViewer.Loaded += ParentScrollViewer_Loaded; } if (Scrolling || Resizing) { if (ParentScrollViewer == null) { return; } MatrixTransform tr = RootVisual.TransformToDescendant(ParentScrollViewer) as MatrixTransform; var scrollRect = new Rect(new Size(ParentScrollViewer.ViewportWidth, ParentScrollViewer.ViewportHeight)); var c = tr.TransformBounds(newRect); var intersect = Rect.Intersect(scrollRect, c); if (!intersect.IsEmpty) { tr = ParentScrollViewer.TransformToDescendant(this) as MatrixTransform; intersect = tr.TransformBounds(intersect); finalRect = ScaleRectUpToDPI(intersect, dpiScale); } else { finalRect = intersect = new Rect(); } int x1 = (int)Math.Round(finalRect.X); int y1 = (int)Math.Round(finalRect.Y); int x2 = (int)Math.Round(finalRect.Right); int y2 = (int)Math.Round(finalRect.Bottom); SetRegion(x1, y1, x2, y2); this.Scrolling = false; this.Resizing = false; } LocationChanged?.Invoke(this, new EventArgs()); }
protected override void OnWindowPositionChanged(Rect rcBoundingBox) { DpiScale dpiScale = new DpiScale() { DpiScaleX = RenderSettings.dpiScaleX, DpiScaleY = RenderSettings.dpiScaleY }; base.OnWindowPositionChanged(rcBoundingBox); if (ParentScrollViewer == null) { return; } Rect newRect = ScaleRectDownFromDPI(rcBoundingBox, dpiScale); GeneralTransform tr = RootVisual.TransformToDescendant(ParentScrollViewer); var scrollRect = new Rect(new Size(ParentScrollViewer.ViewportWidth, ParentScrollViewer.ViewportHeight)); var intersect = Rect.Intersect(scrollRect, tr.TransformBounds(newRect)); if (!intersect.IsEmpty) { tr = ParentScrollViewer.TransformToDescendant(this); intersect = tr.TransformBounds(intersect); intersect = ScaleRectUpToDPI(intersect, dpiScale); } else { intersect = new Rect(); } int x1 = (int)Math.Round(intersect.Left); int y1 = (int)Math.Round(intersect.Top); int x2 = (int)Math.Round(intersect.Right); int y2 = (int)Math.Round(intersect.Bottom); SetRegion(x1, y1, x2, y2); }