Automatisches Scaling?

XStone

Grünschnabel
Hallo zusammen,

um meine Frage zu vereinfachen, reduziere ich mal das was ich machen möchte auf das Nötigste:

Ich möchte eine Linie in einer Viewbox zeichnen - von links oben nach rechts unten.
Ich würde aber gerne diese Linie von 0,0 nach 1000, 1000 zeichnen lassen.
Wenn ich allerdings die Anwendung dann starte, sehe ich in der Viewbox nur einen kleinen Ausschnitt der Linie (angenommen meine Anwendung ist 200 x 200 Pixel groß).

Gibt es eine Möglichkeit - egal wie groß meine Anwendung ist - dass ich immer die gesamte Linie sehe?
Ich habe schon viel in der Viewbox mit "Stretch" herumprobiert - leider vergebens :-(
 
Kannst du mal deinen aktuellen Stand posten? Dann sehe ich auch glelich mal wie du das bis jetzt gelöst hast.
 
Hallo,

danke für Deine Antwort.

ich habe mir ein eigenes Control geschrieben:

Code:
class MyChartUserControl : Viewbox

Dort zeichne ich in einem Bereich von 0 - 999 x 0 - 800 Einheiten:

Code:
            myVisual = new DrawingVisual();
            DrawingContext dc = myVisual.RenderOpen();

            LinearGradientBrush myBrush = new LinearGradientBrush(Color.FromArgb(255, 0, 200, 100), Color.FromArgb(255, 111, 0, 0), 45.0f);
            Pen p = new Pen(myBrush, 5);
            p.StartLineCap = PenLineCap.Round;
            p.EndLineCap = PenLineCap.Round;
            //dc.DrawLine(p, new Point(75, 160), new Point(175, 150));

            dc.DrawGeometry(myBrush, p, Geometry.Parse(
                @"F 1
                  M 10,10
                  L 100,20 M 100,20
                  L 130,50 M 130,50
                  L 180,799 M 180,799
                  L 400,50 M 400,50
                  L 999,00 M 999,00
                  Z "));
            dc.Close();

Sieht komplizierter aus als es ist - es ist nur ein erster Test, um Linien zu zeichnen.

Dieses Control bette ich in einem 3 x 3 Grid ein (3 Spalten, 3 Zeilen):
Das Grid wiederum ist in einer Viewbox enthalten:

Code:
    <Viewbox>
        <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50"></ColumnDefinition>
            <ColumnDefinition Width="200"></ColumnDefinition>
            <ColumnDefinition Width="50"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="20"></RowDefinition>
            <RowDefinition Height="20"></RowDefinition>
            <RowDefinition Height="20"></RowDefinition>
        </Grid.RowDefinitions>

            <Rectangle Grid.Column="0" Grid.Row="0" Fill="Orange"/>
            <Rectangle Grid.Column="1" Grid.Row="0" Fill="Red"/>
            <Rectangle Grid.Column="2" Grid.Row="0" Fill="Orange"/>

            <Rectangle Grid.Column="0" Grid.Row="1" Fill="Green"/>
            <Rectangle Grid.Column="1" Grid.Row="1" Fill="Yellow"/>
            <Rectangle Grid.Column="2" Grid.Row="1" Fill="Green"/>

            <Rectangle Grid.Column="0" Grid.Row="2" Fill="Orange"/>
            <Rectangle Grid.Column="1" Grid.Row="2" Fill="Red"/>
            <Rectangle Grid.Column="2" Grid.Row="2" Fill="Orange"/>
            
            <local:MyChartUserControl Grid.Column="1" Grid.Row="1" Width="Auto"/>

...diese ganzen Rectangles sind nur zu Debugging-Zwecke.

Nun zum Kern: Ich sage ja dem Control, dass es in Feld 1, 1 des Grids gezeichnet werden soll. Jedoch "schießt" die Linie immer über das Gridfeld hinaus auf die nächste Spalte!
Ich möchte gerne erreichen, dass sich die komplette() Linie des Controls im Feld 1, 1 des Grids befindet - nicht abgeschnitten, sondern automatisch skaliert, eingepasst.
Am liebsten noch ohne dass ich eine feste Breite für die 2. Spalte des Grids angeben muß...

Klingt vielleicht kompliziert - ist aber im Grunde genommen ganz einfach: Ich möchte in dem Control von einer FESTEN Größe (=Zeichenbereich) ausgehen - einbetten soll sich das Control dann aber letztendlich komplett - d.h. wenn ich es z.B. in eine ViewBox oder Grid einbette, sollen die 1000 x 800 Einheiten sich auf das eingebettete Feld beziehen.

...so - ich hoffe dass mich nach dem ganzen Geschwafel noch irgendwer versteht ;-)

Viele Grüße

Stone
 
Ah! Ok - bin doch selbst auf die Lösung gekommen:

Kernpunkt ist folgendes:
Wenn ich in einem selbstgeschriebenen Control zeichnen möchte und ich möchte mir selbst eine feste "Zeichenfläche" erstellen, kann ich das ruhig tun. Wichtig bei der ganzen Sche ist nur, dass ich beim Einbinden des Controls (z.B. in ein Grid) an der entsprechenden Stelle sage: Width und Height = Größe meiner Zeichenfläche (einfach fest angeben - z.B. Width = "1000" Height = "800").
Jetzt wird das Control innerhalb des Grids gezeichnet - jedoch immer noch immer über die Gridzelle hinaus.
Um das ganze einzupassen, setze ich um mein Control jetzt einfach eine Viewbox mit Stretch = "Fill". Jetzt wird der Inhalt der Gridzelle automatisch skaliert - und somit genau eingepaßt.

Sorry - vielleicht ist die Lösung nicht optimal - aber Ich bin noch nicht lange in WPF zu Hause. Wenn jemand eine bessere Lösung hat, immer her damit! ;-)


So - hier noch der XAML-Code:

Code:
    <Grid ShowGridLines="False">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="100"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="80"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="80"></RowDefinition>
        </Grid.RowDefinitions>
        
        <Viewbox Grid.Column="1" Grid.Row="1" Stretch="Fill">
            <local:MyChartUserControl Width="1000" Height="800"/>    
        </Viewbox>
    </Grid>
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück