Fix GetDeviceCoordinates. In some cases PresentationSource.FromVisual(this) may return null.

This commit is contained in:
hemn.still
2015-01-30 15:16:24 +04:00
parent d26ca4483f
commit 0f7f9778c1
3 changed files with 41 additions and 19 deletions

View File

@@ -0,0 +1,39 @@
using System;
using System.Windows.Interop;
namespace Hardcodet.Wpf.TaskbarNotification.Interop
{
public static class SystemInfo
{
private static Tuple<double, double> dpiFactors;
private static Tuple<double, double> DpiFactors
{
get
{
if (dpiFactors == null)
using (var source = new HwndSource(new HwndSourceParameters()))
dpiFactors = Tuple.Create(source.CompositionTarget.TransformToDevice.M11, source.CompositionTarget.TransformToDevice.M22);
return dpiFactors;
}
}
public static double DpiXFactor
{
get
{
var factors = DpiFactors;
return factors != null ? factors.Item1 : 1;
}
}
public static double DpiYFactor
{
get
{
var factors = DpiFactors;
return factors != null ? factors.Item2 : 1;
}
}
}
}

View File

@@ -47,6 +47,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="BalloonIcon.cs" />
<Compile Include="Interop\SystemInfo.cs" />
<Compile Include="Interop\TrayInfo.cs">
<SubType>Code</SubType>
</Compile>

View File

@@ -962,25 +962,7 @@ namespace Hardcodet.Wpf.TaskbarNotification
/// <returns></returns>
private Point GetDeviceCoordinates(Point point)
{
if (double.IsNaN(scalingFactor))
{
//calculate scaling factor in order to support non-standard DPIs
var presentationSource = PresentationSource.FromVisual(this);
if (presentationSource == null)
{
scalingFactor = 1;
}
else
{
var transform = presentationSource.CompositionTarget.TransformToDevice;
scalingFactor = 1/transform.M11;
}
}
//on standard DPI settings, just return the point
if (scalingFactor == 1.0) return point;
return new Point() {X = (int) (point.X*scalingFactor), Y = (int) (point.Y*scalingFactor)};
return new Point() { X = (int)(point.X / SystemInfo.DpiXFactor), Y = (int)(point.Y / SystemInfo.DpiYFactor) };
}
#region Dispose / Exit