2017-12-12 2 views
1

Ich arbeite mit 3rd-Party-Anwendung, die ein 3D-Modelle mit Einheit zeichnet. Ich werde die height, width und position an die Bibliothek senden, und es wird ein 3D-Design abhängig von den Werten, die ich gesendet habe, angezeigt.Größe ändern auf die tatsächliche Höhe und Breite funktioniert nicht richtig

Das Bild unten zeigt, wo die Ansicht rendern soll, der violette Bereich mit rotem Rand. The view sould render at the purple area , wie Sie in der rechten unteren Ecke sehen können, habe ich die tatsächliche Höhe und Breite gedruckt sowohl für die Benutzersteuerung und die Grenzlinie im mit diesem Code:

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

und ich habe das gleiche Ergebnis, wenn die immer tatsächliche Höhe und Breite von Code hinter ihnen in die Bibliothek zu senden:

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; 

und ich habe die gleichen Ergebnisse, wenn sie den Bereich Snoop mit Überprüfung enter image description here

wie Sie sehen können, ist die Ergebnisse 643 für die Höhe und 1470 für die Breite.

aber die gerenderte Ansicht ist immer kleiner als der tatsächliche Bereich. also habe ich einen Screenshot gemacht und mit der Farbanwendung, habe ich Höhe 772 und die Breite ist 1763. also sende ich diese Werte genau so, wie ich sie von der Farbe bekommen habe, und die Ansicht wurde genau so wiedergegeben, wie ich es wollte.

enter image description here

Was genau ist passiert? und wie soll ich die richtigen Werte bekommen?

Antwort

1

Sieht aus, als hätten Sie Probleme mit der Windows-UI-DPI-Skalierung. Sie können durch diese Eigenschaften Fenster Skala erhalten:

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

scaleX und scaleY wird multipiler die für Ihre Breite und Höhe enthalten.

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

Obwohl die @Mikolaytis Antwort arbeitet, fand ich eine einfachere Lösung GetDpi() Methode verwenden,

var dpiScale = VisualTreeHelper.GetDpi(this); 
var height = this.ActualHeight * dpiScale.DpiScaleY; 
var width = this.ActualWidth * dpiScale.DpiScaleX; 
Verwandte Themen