diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindowBase.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindowBase.cs index 126144807f..bd2eed2f8f 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindowBase.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindowBase.cs @@ -244,10 +244,12 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion void UpdatePosition() { TextView textView = this.TextArea.TextView; + // PointToScreen returns device dependent units (physical pixels) Point location = textView.PointToScreen(visualLocation - textView.ScrollOffset); Point locationTop = textView.PointToScreen(visualLocationTop - textView.ScrollOffset); - Size completionWindowSize = new Size(this.ActualWidth, this.ActualHeight); + // Let's use device dependent units for everything + Size completionWindowSize = new Size(this.ActualWidth, this.ActualHeight).TransformToDevice(this); Rect bounds = new Rect(location, completionWindowSize); Rect workingScreen = System.Windows.Forms.Screen.GetWorkingArea(location.ToSystemDrawing()).ToWpf(); if (!workingScreen.Contains(bounds)) { @@ -263,6 +265,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion bounds.Y = workingScreen.Top; } } + // Convert the window bounds to device independent units + bounds = bounds.TransformFromDevice(this); this.Left = bounds.X; this.Top = bounds.Y; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs index c1db21e651..7a4d6519d8 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs @@ -161,6 +161,32 @@ namespace ICSharpCode.AvalonEdit.Utils } #endregion + #region DPI independence + public static Rect TransformToDevice(this Rect rect, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return Rect.Transform(rect, matrix); + } + + public static Rect TransformFromDevice(this Rect rect, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return Rect.Transform(rect, matrix); + } + + public static Size TransformToDevice(this Size size, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; + return new Size(size.Width * matrix.M11, size.Height * matrix.M22); + } + + public static Size TransformFromDevice(this Size size, Visual visual) + { + Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice; + return new Size(size.Width * matrix.M11, size.Height * matrix.M22); + } + #endregion + #region System.Drawing <-> WPF conversions public static System.Drawing.Point ToSystemDrawing(this Point p) {