将控件调整为实际高度和宽度无法正常工作

时间:2017-12-12 08:58:22

标签: c# wpf xaml

我正在使用第三方应用程序,它使用统一绘制3D模型。 我想将heightwidthposition发送到库中,它会根据我发送的值显示3D设计。

下图显示了视图应呈现的位置,紫色区域带有红色边框。 The view sould render at the purple area 正如您在右下角所看到的,我使用以下代码打印了用户控件和边框内部的实际高度和宽度:

<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;

使用Snoop检查区域时,我得到了相同的结果 enter image description here

正如您所看到的结果, 643表示高度,1470表示宽度

但渲染视图总是小于实际区域。所以我拍了一张截图并使用了绘画应用程序,我得到高度为772,宽度为1763 。所以我完全按照从绘画中获取这些值来发送这些值,并且视图完全按照我想要的方式呈现。

enter image description here

究竟发生了什么?以及我想如何获得正确的值?

2 个答案:

答案 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;
}

scaleXscaleY将包含您的宽度和高度的倍数。

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;