Laden...

Hilfe bei Codeverständnis

Erstellt von srynoname vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.445 Views
S
srynoname Themenstarter:in
223 Beiträge seit 2006
vor 14 Jahren
Hilfe bei Codeverständnis

Hallo,

kann mir jemand grob erklären, wie in diesem MSDN Beispiel der Grid Hintergrund erzeugt wird?
http://msdn.microsoft.com/de-de/library/system.windows.media.guidelineset.aspx

Der Code dafür scheint

<Border.Background>
      <DrawingBrush  Viewport="0,0,10,10" ViewportUnits="Absolute" TileMode="Tile"
        PresentationOptions:Freeze="True">
        <DrawingBrush.Drawing>
          <DrawingGroup>
            <GeometryDrawing Brush="White">
              <GeometryDrawing.Geometry>
                <RectangleGeometry Rect="0,0,1,1" />
              </GeometryDrawing.Geometry>
            </GeometryDrawing>
            <GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z " Brush="#CCCCFF" />
            <GeometryDrawing Geometry="M0,0 L0,1 0.1,1, 0.1,0Z" Brush="#CCCCFF" />
          </DrawingGroup>
        </DrawingBrush.Drawing>
      </DrawingBrush>    
    </Border.Background>

bzw.

 //
            // Use a DrawingBrush to create a grid background.
            //
            GeometryDrawing backgroundRectangleDrawing =
                new GeometryDrawing(
                    Brushes.White,
                    null,
                    new RectangleGeometry(new Rect(0,0,1,1))
                );
            PolyLineSegment backgroundLine1 = new PolyLineSegment();
            backgroundLine1.Points.Add(new Point(1, 0));
            backgroundLine1.Points.Add(new Point(1, 0.1));
            backgroundLine1.Points.Add(new Point(0, 0.1));
            PathFigure line1Figure = new PathFigure();
            line1Figure.Segments.Add(backgroundLine1);
            PathGeometry backgroundLine1Geometry = new PathGeometry();
            backgroundLine1Geometry.Figures.Add(line1Figure);
            GeometryDrawing backgroundLineDrawing1 = new GeometryDrawing(
                    new SolidColorBrush(Color.FromArgb(255,204,204,255)),
                    null,
                    backgroundLine1Geometry
                );
            PolyLineSegment backgroundLine2 = new PolyLineSegment();
            backgroundLine2.Points.Add(new Point(0, 1));
            backgroundLine2.Points.Add(new Point(0.1, 1));
            backgroundLine2.Points.Add(new Point(0.1, 0));
            PathFigure line2Figure = new PathFigure();
            line2Figure.Segments.Add(backgroundLine2);
            PathGeometry backgroundLine2Geometry = new PathGeometry();
            backgroundLine2Geometry.Figures.Add(line2Figure);
            GeometryDrawing backgroundLineDrawing2 = new GeometryDrawing(
                    new SolidColorBrush(Color.FromArgb(255, 204, 204, 255)),
                    null,
                    backgroundLine2Geometry
                );

            DrawingGroup backgroundGroup = new DrawingGroup();
            backgroundGroup.Children.Add(backgroundRectangleDrawing);
            backgroundGroup.Children.Add(backgroundLineDrawing1);
            backgroundGroup.Children.Add(backgroundLineDrawing2);

            DrawingBrush gridPatternBrush = new DrawingBrush(backgroundGroup);
            gridPatternBrush.Viewport = new Rect(0, 0, 10, 10);
            gridPatternBrush.ViewportUnits = BrushMappingMode.Absolute;
            gridPatternBrush.TileMode = TileMode.Tile;
            gridPatternBrush.Freeze();

zu sein, aber ich werde daraus nicht so richtig schlau!? Danke für eure Hilfe 😃

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo srynoname,

was genau erwartest du dir jetzt.
Eigentlich müsstest du schon wissen dass du mit einer solchen Frage keine bahnbrechende Antwort bekommen kannst.

Aber nichtsdestotrotz (das wort sieht irgendwie strange aus 😃 ) versuche ich es wenigstens.
Also beim XAML Code setzt der den Border - Backgtround auf einen DrawingBrush.
Bei welchem er angibt dass dessen Drawing den TileMode = Tile hat. d.h. dass er die dinger aufteilt.
Zudem setzt er noch die Vieport einheiten.
Als Drawing verwendet er da eine Drawing group die 3 Geometry-drawings enthält wobei diese dann einfach ein weisses rectangle bzw. noch zwei andere Shapes zeichnen.

Thats it. Den C# code erkläre ich jetzt nicht ganz denn der ist verdammt lang 😃

Da musst du dich einfach durchkämpfen denn wir können dir hier das Zeug nicht Zeile für Zeile erklären.
Dazu musst du dich schon selbst einlesen und mit der Zeit versteht man das dann schon..

Gruss
Michael

6.862 Beiträge seit 2003
vor 14 Jahren

Hallo,

Der Code ist kein Hexenwerk (XAML und C# machen übrigens genau das gleiche). Es werden in einem 11 Rechteck zwei Linien gezeichnet, eine Horizontal und eine Vertikal und das Rechteck wird durch den Viewport auf 1010 gestreckt und durch die Tile Eigenschaft wiederholt. Dadurch ergibt sich dann das Gridmuster. Der Code an sich zeichnet sozusagen aber nur eine solche Zelle.

Das ist übrigens nen ganz gutes Beispiel an dem man sieht wie ausdrucksstark XAML im Vergleich zu C# ist, wenn man sich alleine die Länge der nötigen Quelltexte anguckt.

Baka wa shinanakya naoranai.

Mein XING Profil.

S
srynoname Themenstarter:in
223 Beiträge seit 2006
vor 14 Jahren

Hallo,

danke für eure Antworten, ihr habt recht, die Frage war ungeschickt gestellt. Habe mich zusammen mit euren Hinweisen nochmal drangesetzt und z.B. diese Kurzschreibweise "M0,0 L0,1 0.1,1, 0.1,0Z" verstanden / einen MSDN Artikel dazu gefunden.

Einiges ist mir jedoch noch nicht so ganz klar:

<GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z " Brush="#CCCCFF" />

müsste doch eine Linie unten im Rechteck zeichnen, beide Geometrien müssten somit ein L darstellen? Setzt man die Border Thickness auf 0 sieht man jedoch, dass die beiden Geometrien ein F (ohne den Strich in der Mitte) bilden müssen, denn linken und oberen äußeren Rand ist ein Rahmen vorhanden, aber eben nichts rechts und unten?

6.862 Beiträge seit 2003
vor 14 Jahren

Einiges ist mir jedoch noch nicht so ganz klar:

<GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z " Brush="#CCCCFF" />  

müsste doch eine Linie unten im Rechteck zeichnen...

Nein, es zeichnet eine Linie von rechts oben nach links oben und die andere Zeile aus dem Ursprungsposting zeichnet von links unten nach links oben eine Linie.

Was du da angibst sind ja einfache X/Y Koordinaten. Was man zum Verständnis noch beachten muss, ist die Tatsache das das Koordinatensystem links oben den Ursprung hat und die x Achse nach rechts und y Achse nach unten ihre positiven Werte haben.

Baka wa shinanakya naoranai.

Mein XING Profil.

S
srynoname Themenstarter:in
223 Beiträge seit 2006
vor 14 Jahren

ah danke, nun klingelts. jetzt hab ich es doch wirklich auch mal geschafft, das ganze mit dem mathematischen koordsys. zu verwechseln 😉