Skip to content

Commit 7bdbd39

Browse files
authored
Fix incorrect ComboxPopup position when used ScaleTransform #2179 (#2180)
* Fix incorrect ComboxPopup position when used ScaleTranform #2179 * Update ScaleHelper.cs
1 parent a52a1d0 commit 7bdbd39

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

MaterialDesignThemes.Wpf/ComboBoxPopup.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ private PositioningData GetPositioningData(IEnumerable<DependencyObject?> visual
287287
var mainVisual = visualAncestry.OfType<Visual>().LastOrDefault();
288288
if (mainVisual is null) throw new ArgumentException($"{nameof(visualAncestry)} must contains unless one {nameof(Visual)} control inside.");
289289

290+
var controlVisual = visualAncestry.OfType<Visual>().FirstOrDefault();
291+
if (controlVisual == null) throw new ArgumentException($"{nameof(visualAncestry)} must contains unless one {nameof(Visual)} control inside.");
292+
290293
var screen = Screen.FromPoint(locationFromScreen);
291294
var screenWidth = (int)screen.Bounds.Width;
292295
var screenHeight = (int)screen.Bounds.Height;
@@ -295,10 +298,10 @@ private PositioningData GetPositioningData(IEnumerable<DependencyObject?> visual
295298
var locationX = (int)(locationFromScreen.X - screen.Bounds.X) % screenWidth;
296299
var locationY = (int)(locationFromScreen.Y - screen.Bounds.Y) % screenHeight;
297300

298-
var upVerticalOffsetIndependent = DpiHelper.TransformToDeviceY(mainVisual, UpVerticalOffset);
301+
var upVerticalOffsetIndependent = DpiHelper.TransformToDeviceY(mainVisual, UpVerticalOffset) * ScaleHelper.GetTotalTransformScaleY(controlVisual);
299302
var newUpY = upVerticalOffsetIndependent - popupSize.Height + targetSize.Height;
300-
var newDownY = DpiHelper.TransformToDeviceY(mainVisual, DownVerticalOffset);
301-
var offsetX = DpiHelper.TransformToDeviceX(mainVisual, RelativeHorizontalOffset);
303+
var newDownY = DpiHelper.TransformToDeviceY(mainVisual, DownVerticalOffset) * ScaleHelper.GetTotalTransformScaleY(controlVisual);
304+
var offsetX = DpiHelper.TransformToDeviceX(mainVisual, RelativeHorizontalOffset) * ScaleHelper.GetTotalTransformScaleX(controlVisual);
302305
if (FlowDirection == FlowDirection.LeftToRight)
303306
offsetX = Round(offsetX);
304307
else
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Windows;
7+
using System.Windows.Media;
8+
9+
namespace MaterialDesignThemes.Wpf
10+
{
11+
internal static class ScaleHelper
12+
{
13+
internal static double GetTotalTransformScaleX(Visual visual)
14+
{
15+
double totalTransform = 1.0d;
16+
DependencyObject currentVisualTreeElement = visual;
17+
do
18+
{
19+
if (currentVisualTreeElement is Visual)
20+
{
21+
visual = (Visual)currentVisualTreeElement;
22+
Transform transform = VisualTreeHelper.GetTransform(visual);
23+
if ((transform != null) &&
24+
(transform.Value.M12 == 0) &&
25+
(transform.Value.OffsetX == 0))
26+
{
27+
totalTransform *= transform.Value.M11;
28+
}
29+
}
30+
currentVisualTreeElement = VisualTreeHelper.GetParent(currentVisualTreeElement);
31+
}
32+
while (currentVisualTreeElement != null);
33+
34+
return totalTransform;
35+
}
36+
37+
internal static double GetTotalTransformScaleY(Visual visual)
38+
{
39+
double totalTransform = 1.0d;
40+
DependencyObject currentVisualTreeElement = visual;
41+
do
42+
{
43+
if (currentVisualTreeElement is Visual)
44+
{
45+
visual = (Visual)currentVisualTreeElement;
46+
Transform transform = VisualTreeHelper.GetTransform(visual);
47+
if ((transform != null) &&
48+
(transform.Value.M21 == 0) &&
49+
(transform.Value.OffsetY == 0))
50+
{
51+
totalTransform *= transform.Value.M22;
52+
}
53+
}
54+
currentVisualTreeElement = VisualTreeHelper.GetParent(currentVisualTreeElement);
55+
}
56+
while (currentVisualTreeElement != null);
57+
58+
return totalTransform;
59+
}
60+
}
61+
}

0 commit comments

Comments
 (0)