我正在使用第三方应用程序,它使用统一绘制3D模型。
我想将height
,width
和position
发送到库中,它会根据我发送的值显示3D设计。
下图显示了视图应呈现的位置,紫色区域带有红色边框。 正如您在右下角所看到的,我使用以下代码打印了用户控件和边框内部的实际高度和宽度:
<DockPanel>
<TextBlock DockPanel.Dock="Bottom" HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding ActualHeight, StringFormat={}{0}: height, RelativeSource={RelativeSource AncestorType=UserControl}}" />
<TextBlock DockPanel.Dock="Bottom" HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding ActualHeight, StringFormat={}{0}: border height, RelativeSource={RelativeSource AncestorType=Border}}" />
<TextBlock DockPanel.Dock="Bottom" HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding ActualWidth, StringFormat={}{0}: width, RelativeSource={RelativeSource AncestorType=UserControl}}" />
<TextBlock DockPanel.Dock="Bottom" HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding ActualWidth, StringFormat={}{0}: border width, RelativeSource={RelativeSource AncestorType=Border}}" />
</DockPanel>
从后面的代码获取实际高度和宽度以将它们发送到库时,我得到了相同的结果:
Point position = Application.Current.MainWindow.PointToScreen(new Point(0d, 0d));
var pointToScreen = PointToScreen(new Point(0d, 0d));
pointToScreen.X -= position.X;
pointToScreen.Y -= position.Y;
var actualHeight = this.ActualHeight;
var actualWidth = this.ActualWidth;
var actualBorderHeight = renderBorder.ActualHeight;
var actualBorderWidth = renderBorder.ActualWidth;
正如您所看到的结果, 643表示高度,1470表示宽度。
但渲染视图总是小于实际区域。所以我拍了一张截图并使用了绘画应用程序,我得到高度为772,宽度为1763 。所以我完全按照从绘画中获取这些值来发送这些值,并且视图完全按照我想要的方式呈现。
究竟发生了什么?以及我想如何获得正确的值?
答案 0 :(得分:1)
看起来你有Windows UI DPI扩展问题。 您可以通过此属性获得窗口缩放:
PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow);
double scaleX, scaleY;
if (source != null) {
scaleX = source.CompositionTarget.TransformToDevice.M11;
scaleY = source.CompositionTarget.TransformToDevice.M22;
}
scaleX
和scaleY
将包含您的宽度和高度的倍数。
var actualHeight = this.ActualHeight * scaleY;
var actualWidth = this.ActualWidth * scaleX;
var actualBorderHeight = renderBorder.ActualHeight * scaleY;
var actualBorderWidth = renderBorder.ActualWidth * scaleX;
答案 1 :(得分:1)
虽然@Mikolaytis的答案有效,但我找到了一个使用GetDpi()方法的简单解决方案,
var dpiScale = VisualTreeHelper.GetDpi(this);
var height = this.ActualHeight * dpiScale.DpiScaleY;
var width = this.ActualWidth * dpiScale.DpiScaleX;