Schwenken Sie den Panning-Betrag, um zu verhindern, dass das Bild vom Fenster abkommt

8

EINLEITUNG:

Ich habe SVG als XAML exportiert und es wurde in Canvas mit einer enormen Anzahl von Pfaden umgewandelt.

Nachdem der Canvas-Hauptinhalt des einfachen, automatisch generierten Fensters erstellt wurde, wurde das Bild abgeschnitten, da es größer als das Clientrechteck des Hauptfensters war.

Ich habe dieses Problem gelöst, indem ich Panning implementiert habe.

Da ich später mit dem Zooming herumspielen möchte, habe ich dummy ScaleTransform in XAML des Canvas hinzugefügt und RenderTransformOrigin in 0.5 , 0.5 geändert (damit kann ich das Bild um seine Mitte herum zoomen).

Ich wollte, dass das Bild zentriert wird, wenn das Fenster geladen wird, also habe ich dieses Canvas in Viewbox platziert, was gut funktioniert, nachdem ich einige Eigenschaften angepasst habe.

PROBLEM:

Da ich die RenderTransformOrigin des Canvas geändert habe, kann ich keine mathematische Berechnung durchführen, die es mir ermöglicht, den Panning-Anteil zu begrenzen.

Obwohl die Viewbox der Inhalt des Hauptfensters ist, kann ich keine Dimensionen des Hauptfenster-Client-Bereichs erhalten (Viewbox passt die Größe an seinen Inhalt an). Das macht meine Aufgabe noch schwieriger.

MEINE BEMÜHUNGEN, DIES ZU LÖSEN:

Es scheint keinen anderen Weg zu geben, das Client-Rechteck des Hauptfensters zu erhalten, außer mit der Verwendung von P/Invoke und GetClientRect WinAPI-Aufruf.

Es gab einen weiteren Hack mit der Abfrage von SystemParametersInfo für Nicht-Client-Metriken wie Borders und Titelleiste, aber das ist eine Schätzung , die aufgrund von angewandten Themen und ähnlichem fehlschlagen könnte.

Ich habe nicht versucht, P/Invoke zu verwenden, weil ich es im Moment einfach ablehne. Es muss eine bessere Lösung geben! Dieser Pfad sollte meine letzte Wahl sein, und die, die ich aus reiner Verzweiflung machen werde.

Ich habe versucht, einen alternativen Ansatz zu finden, bin aber gescheitert.

Ich habe versucht, TransformToAncestor(...).Transformtobounds(..) für meine Berechnungen zu verwenden, aber das ist auch gescheitert.

FRAGE:

Wie kann man das Schwenken einschränken, damit das Bild nicht aus dem Hauptfenster verschwindet, wenn der Benutzer zu viel schleppt?

Ich werde alternative Lösungen akzeptieren. Code, der eingereicht wurde, war ein Versuch eines unerfahrenen Autodidakten, also akzeptiere ich konstruktive Kritik und Ratschläge.

Relevante Informationen:

Um diesen Post so kurz wie möglich zu halten, gebe ich nur relevante XAML- und "code behind" -Snippets weiter unten.

Der vollständige Code wird in Pastebin eingefügt und kann ganz unten in diesem Post gefunden werden.

Relevante XAML-Snippets:

%Vor%

Relevanter Code hinter Snippets:

%Vor%

Hier ist der vollständige XAML und hier ist voll "Code hinter".

    
AlwaysLearningNewStuff 14.10.2015, 20:39
quelle

2 Antworten

1

Ich habe wirklich die ganze Frage nicht gelesen (ich denke, niemand wird das), aber hier ist der Code, den ich in einer Charting-Bibliothek verwende, um das Panning einzuschränken. Das ist die Mathematik. jetzt adapt es für Sie Fall. Tipp: Geben Sie beim nächsten Mal nur den relevanten Code ein, damit wir eine bessere Antwort geben können.

Ich rufe diese Methode auf, wenn das Panning beendet wird (mouse up in meinem Fall)

Wenn es hilft, ist dies die Bibliothek ( Ссылка ), vielleicht kann es Ihnen auch helfen, den Quellcode zu sehen . Entspannen Sie sich, ich denke, Sie machen es viel schwieriger als das, was es ist.

%Vor%     
bto.rdz 15.10.2015 04:26
quelle
1

Klingt kriminell einfach, aber wenn Sie verhindern möchten, dass Ihr Vektor außerhalb des ihm zugewiesenen Bereichs abgeschnitten wird, ändern Sie einfach Stretch="UniformToFill" Ihrer Viewbox in Stretch="Uniform" ?

    
Logan 19.10.2015 11:22
quelle

Tags und Links