2017-12-12 14 views
1

私は3つのモデルを1つ使用して描画するサードパーティのアプリケーションを使用しています。 heightwidth、およびpositionをライブラリに送信すると、送信した値に応じて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; 

スヌープ にenter image description here

を使用してエリアをチェックするとき、私は同じ結果を得ました

をご覧ください。結果は643、幅はです。

レンダリングされたビューは、実際の領域より常に小さくなります。私はスクリーンショットを取って、塗料アプリケーションを使用して、私はの高さは772であり、幅は1763です。だから私はそれらの値をペイントから得たものとまったく同じものにして、私の望む通りにビューをレンダリングしました。

enter image description here

ので、正確に何が起こっているのでしょうか?正しい値をどうやって得るのでしょうか?

答えて

1

Windows UIのDPIスケーリングに問題があるようです。 あなたは、このプロパティによって、Windowsのスケールを得ることができます。

PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow); 
double scaleX, scaleY; 
if (source != null) { 
    scaleX = source.CompositionTarget.TransformToDevice.M11; 
    scaleY = source.CompositionTarget.TransformToDevice.M22; 
} 

scaleXscaleYがあなたの幅と高さのためmultipilerのが含まれています。

var actualHeight = this.ActualHeight * scaleY; 
var actualWidth = this.ActualWidth * scaleX; 
var actualBorderHeight = renderBorder.ActualHeight * scaleY; 
var actualBorderWidth = renderBorder.ActualWidth * scaleX; 
1

その@Mikolaytisの答えは働いているが、私は

var dpiScale = VisualTreeHelper.GetDpi(this); 
var height = this.ActualHeight * dpiScale.DpiScaleY; 
var width = this.ActualWidth * dpiScale.DpiScaleX; 
GetDpi()メソッドを使用して簡単な解決策を見つけました
関連する問題