[转]Dynamic and static Rectangle in WPF

此文转载自:Raj Kumar

In geometry, a rectangle is defined as a quadrilateral where all four of its angles are right angles (90 degrees).

The <Rectangle /> element of XAML draws a rectangle. The Height and Width attributes represent the height and width of the rectangle. The Stroke and Stroke Thickness represents the color and thickness of the rectangle boundary.

In this example, I am showing you how to draw a rectangle static and dynamic. Static rectangle means the rectangle is drawn totally based on XAML code while dynamic rectangle means, I create the rectangle using code in the code behind file.

  1. This code shows how to draw a rectangle:

    <!--static rectangle -->
    <Canvas Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" Margin="50,20,0,0">
          <Rectangle Width="150" Height="150" Stroke="Red" Fill="Gray" StrokeThickness="2"></Rectangle>
    </
    Canvas>
    <
    TextBlock Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center">Static Rectangle</TextBlock>

    Draw a rectangle dynamically:

    <!--dynamic rectangle -->
    <Canvas x:Name="canvas" Grid.Column="1" Grid.Row="0" Margin="50,20,0,0"></Canvas>
    <
    TextBlock Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center">Dynamic Rectangle</TextBlock>

    private
    void DrawRectangle()
    {

                Rectangle exampleRectangle = new Rectangle();
                exampleRectangle.Width = 150;
                exampleRectangle.Height = 150;
                // Create a SolidColorBrush and use it to
                // paint the rectangle.
                SolidColorBrush myBrush = new SolidColorBrush(Colors.Green);
                exampleRectangle.Stroke = Brushes.Red;
                exampleRectangle.StrokeThickness = 4;
                exampleRectangle.Fill = myBrush;
                canvas.Children.Insert(0, exampleRectangle);
     }

    Result looks like this:


    Figure 1.

     

  2. This code shows how draw rectangle with Radius.
     

    <!--static rectangle with radius -->

            <Canvas Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150" RadiusX="10" RadiusY="10" Stroke="Red" Fill="Gray" StrokeThickness="2"></Rectangle>

            </Canvas>

            <TextBlock Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center">Static Rectangle Radius</TextBlock>

    Make dynamically:

    <!--dynamic rectangle with radius -->
            <Canvas x:Name="canvas1" Grid.Column="1" Grid.Row="1" Margin="50,20,0,0"></Canvas>
            <TextBlock Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center">Dynamic Rectangle Radius</TextBlock>

     

    private void RadiusRectangle()

            {

                Rectangle exampleRectangle1 = new Rectangle();

                exampleRectangle1.Width = 150;

                exampleRectangle1.Height = 150;

                exampleRectangle1.RadiusX = 10;

                exampleRectangle1.RadiusY = 10;

                // Create a SolidColorBrush and use it to

                // paint the rectangle.

                SolidColorBrush myBrush = new SolidColorBrush(Colors.Green);

                exampleRectangle1.Stroke = Brushes.Red;

                exampleRectangle1.StrokeThickness = 4;

                exampleRectangle1.Fill = myBrush;

                canvas1.Children.Insert(0, exampleRectangle1);

       

            }

    Result:



    Figure 2.

     

  3. This code shows how to make a rectangle using Gradient colors.
     

    <!--static rectangle with gradient colors-->

            <Canvas Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150">

                  <Rectangle.Fill>

                    <LinearGradientBrush>

                      <GradientStop Color="Yellow" Offset="0.0" />

                      <GradientStop Color="Orange" Offset="0.5" />

                      <GradientStop Color="Red" Offset="1.0" />

                    </LinearGradientBrush>

                  </Rectangle.Fill>

                </Rectangle>

            </Canvas>

            <TextBlock Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center">Static Rectangle Gradient</TextBlock>

    Make Dynamically:
     

    <!--dynamic rectangle with gradient colors-->

            <Canvas x:Name="canvas2" Grid.Column="1" Grid.Row="2" Margin="50,20,0,0"></Canvas>

            <TextBlock Grid.Column="1" Grid.Row="2" HorizontalAlignment="Center">Dynamic Rectangle Gradient</TextBlock>

    private void GradientRectangle()

            {

                Rectangle exampleRectangle = new Rectangle();

                exampleRectangle.Width = 150;

                exampleRectangle.Height = 150;

       

                // Create a RadialGradientBrush and use it to

                // paint the rectangle.

                RadialGradientBrush myBrush = new RadialGradientBrush();

                myBrush.GradientOrigin = new Point(0.75, 0.25);

                myBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0));

                myBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5));

                myBrush.GradientStops.Add(new GradientStop(Colors.Red, 1.0));

       

                exampleRectangle.Fill = myBrush;

                canvas2.Children.Insert(0, exampleRectangle);

            }



    Figure 3.

     

  4. This code shows how to draw a rectangle paint with an image.

    <!--static paint with image-->

            <Canvas Grid.Column="0" Grid.Row="3" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150">               

                    <Rectangle.Fill>

                        <ImageBrush ImageSource="sampleImages\san20a.jpg"  />

                    </Rectangle.Fill>

                </Rectangle>

            </Canvas>

            <TextBlock Grid.Column="0" Grid.Row="3" HorizontalAlignment="Center">Static Rectangle paint with image</TextBlock>

    Dynamically:

    <!--dynamic paint with image-->

    <Canvas x:Name="canvas3" Grid.Column="1" Grid.Row="3" Margin="50,20,0,0"></Canvas>

    <TextBlock Grid.Column="1" Grid.Row="3" HorizontalAlignment="Center">Dynamic Rectangle paint with image</TextBlock>

      private void PaintWithImageRectangle()

            {

                Rectangle exampleRectangle = new Rectangle();

                exampleRectangle.Width = 150;

                exampleRectangle.Height = 150;

       

                // Create an ImageBrush and use it to

                // paint the rectangle.

                ImageBrush myBrush = new ImageBrush();

                myBrush.ImageSource =

                    new BitmapImage(new Uri(@"C:\Users\Raj\Documents\Visual Studio 2008\Projects\Chapter1\Chapter1\sampleImages\san20a.jpg", UriKind.Relative));

       

                exampleRectangle.Fill = myBrush;

                canvas3.Children.Insert(0, exampleRectangle);

            }

    Result:



    Figure 4.
     

  5. This code shows how to draw paint a rectangle with visual effects.

    <!--static paint with visual-->

            <Canvas Grid.Column="2" Grid.Row="0" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150" Stroke="Red" StrokeThickness="4">

                    <Rectangle.Fill>

                        <VisualBrush TileMode="Tile">

                            <VisualBrush.Visual>

                                <StackPanel>

                                    <StackPanel.Background>

                                        <DrawingBrush>

                                            <DrawingBrush.Drawing>

                                                <GeometryDrawing>

                                                    <GeometryDrawing.Brush>

                                                        <RadialGradientBrush>

                                                            <GradientStop Color="MediumBlue" Offset="0.0" />

                                                            <GradientStop Color="White" Offset="1.0" />

                                                        </RadialGradientBrush>

                                                    </GeometryDrawing.Brush>

                                                    <GeometryDrawing.Geometry>

                                                        <GeometryGroup>

                                                            <RectangleGeometry Rect="0,0,50,50" />

                                                            <RectangleGeometry Rect="50,50,50,50" />

                                                        </GeometryGroup>

                                                    </GeometryDrawing.Geometry>

                                                </GeometryDrawing>

                                            </DrawingBrush.Drawing>

                                        </DrawingBrush>

                                    </StackPanel.Background>

                                    <TextBlock FontSize="10pt" Margin="10">Raj Beniwal</TextBlock>

                                </StackPanel>

                            </VisualBrush.Visual>

                        </VisualBrush>

                    </Rectangle.Fill>

                </Rectangle>

            </Canvas>

            <TextBlock Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center">Static Rectangle paint with visual</TextBlock>

    Dynamically:
     

    <!--dynamic paint with image-->

    <Canvas x:Name="canvas4" Grid.Column="3" Grid.Row="0" Margin="50,20,0,0"></Canvas>

    <TextBlock Grid.Column="3" Grid.Row="0" HorizontalAlignment="Center">Dynamic Rectangle paint with visual</TextBlock>

    private void VisualRectangle()

            {

                Rectangle exampleRectangle = new Rectangle();

                exampleRectangle.Width = 150;

                exampleRectangle.Height = 150;

                exampleRectangle.StrokeThickness = 4;

                exampleRectangle.Stroke = Brushes.Red;

       

                // Create a VisualBrush and use it

                // to paint the rectangle.

                VisualBrush myBrush = new VisualBrush();

       

                //

                // Create the brush's contents.

                //

                StackPanel aPanel = new StackPanel();

       

                // Create a DrawingBrush and use it to

                // paint the panel.

                DrawingBrush myDrawingBrushBrush = new DrawingBrush();

                GeometryGroup aGeometryGroup = new GeometryGroup();

                aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));

                aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));

                RadialGradientBrush checkerBrush = new RadialGradientBrush();

                checkerBrush.GradientStops.Add(new GradientStop(Colors.Green, 0.0));

                checkerBrush.GradientStops.Add(new GradientStop(Colors.White, 1.0));

                GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup);

                myDrawingBrushBrush.Drawing = checkers;

                aPanel.Background = myDrawingBrushBrush;

       

                // Create some text.

                TextBlock someText = new TextBlock();

                someText.Text = "Raj Beniwal";

                FontSizeConverter fSizeConverter = new FontSizeConverter();

                someText.FontSize = (double)fSizeConverter.ConvertFromString("10pt");

                someText.Margin = new Thickness(10);

       

                aPanel.Children.Add(someText);

       

                myBrush.Visual = aPanel;

                exampleRectangle.Fill = myBrush;

                canvas4.Children.Insert(0, exampleRectangle);

       

            }



    Figure 5.
     

  6. This code shows how to draw and paint a rectangle with drawing brush.

    <!--static paint with drawing-->

            <Canvas Grid.Column="2" Grid.Row="1" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150">

                    <Rectangle.Fill>

                        <DrawingBrush Viewport="0,0,0.25,0.25" TileMode="Tile">

                            <DrawingBrush.Drawing>

                                <DrawingGroup>

                                    <GeometryDrawing Brush="White">

                                        <GeometryDrawing.Geometry>

                                            <RectangleGeometry Rect="0,0,100,100" />

                                        </GeometryDrawing.Geometry>

                                    </GeometryDrawing>

       

                                    <GeometryDrawing>

                                        <GeometryDrawing.Geometry>

                                            <GeometryGroup>

                                                <RectangleGeometry Rect="0,0,50,50" />

                                                <RectangleGeometry Rect="50,50,50,50" />

                                            </GeometryGroup>

                                        </GeometryDrawing.Geometry>

                                        <GeometryDrawing.Brush>

                                            <LinearGradientBrush>

                                                <GradientStop Offset="0.0" Color="Red" />

                                                <GradientStop Offset="1.0" Color="Green" />

                                            </LinearGradientBrush>

                                        </GeometryDrawing.Brush>

                                    </GeometryDrawing>

                                </DrawingGroup>

                            </DrawingBrush.Drawing>

                        </DrawingBrush>

                    </Rectangle.Fill>

                </Rectangle>

            </Canvas>

            <TextBlock Grid.Column="2" Grid.Row="1" HorizontalAlignment="Center">Static Rectangle paint with drawing</TextBlock>

    Dynamic:
     

    <!--dynamic paint with drawing-->

    <Canvas x:Name="canvas5" Grid.Column="3" Grid.Row="1" Margin="50,20,0,0"></Canvas>

    <TextBlock Grid.Column="3" Grid.Row="1" HorizontalAlignment="Center">Dynamic Rectangle paint with drawing</TextBlock>

    private void PaintWithDrawing()

            {

                Rectangle exampleRectangle = new Rectangle();

                exampleRectangle.Width = 150;

                exampleRectangle.Height = 150;

       

                // Create a DrawingBrush and use it to

                // paint the rectangle.

                DrawingBrush myBrush = new DrawingBrush();

       

                GeometryDrawing backgroundSquare =

                    new GeometryDrawing(

                        Brushes.White,

                        null,

                        new RectangleGeometry(new Rect(0, 0, 100, 100)));

       

                GeometryGroup aGeometryGroup = new GeometryGroup();

                aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));

                aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));

       

                LinearGradientBrush checkerBrush = new LinearGradientBrush();

                checkerBrush.GradientStops.Add(new GradientStop(Colors.Red, 0.0));

                checkerBrush.GradientStops.Add(new GradientStop(Colors.Green, 1.0));

       

                GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup);

       

                DrawingGroup checkersDrawingGroup = new DrawingGroup();

                checkersDrawingGroup.Children.Add(backgroundSquare);

                checkersDrawingGroup.Children.Add(checkers);

       

                myBrush.Drawing = checkersDrawingGroup;

                myBrush.Viewport = new Rect(0, 0, 0.25, 0.25);

                myBrush.TileMode = TileMode.Tile;

       

                exampleRectangle.Fill = myBrush;

                canvas5.Children.Insert(0, exampleRectangle);

            }

    Result:



    Figure 6.

     

  7. This code shows how to draw and fill a rectangle with a brush and opacity (transparency). The Opacity property defines the transparency of a control in XAML and WPF.

    <!--static rectangle with brush -->

            <Canvas Grid.Column="2" Grid.Row="2" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150">

                    <Rectangle.Fill>

                        <SolidColorBrush Color="Green" Opacity="0.25" />

                    </Rectangle.Fill>

                </Rectangle>

            </Canvas>

            <TextBlock Grid.Column="2" Grid.Row="2" HorizontalAlignment="Center">Static Rectangle rectangle with brush</TextBlock>

    Dynamic:
     

    <!--dynamic rectangle using brush-->

            <Canvas x:Name="canvas6" Grid.Column="3" Grid.Row="2" Margin="50,20,0,0"></Canvas>

            <TextBlock Grid.Column="3" Grid.Row="2" HorizontalAlignment="Center">Dynamic Rectangle paint with drawing</TextBlock>

    private void RectangleWithBrush()

            {

                Rectangle myRectangle = new Rectangle();

                myRectangle.Width = 150;

                myRectangle.Height = 150;

                SolidColorBrush partiallyTransparentSolidColorBrush

                    = new SolidColorBrush(Colors.Green);

                partiallyTransparentSolidColorBrush.Opacity = 0.25;

                myRectangle.Fill = partiallyTransparentSolidColorBrush;

                canvas6.Children.Insert(0, myRectangle);

       

            }

    Result:



    Figure 7.

     

  8. This demonstrate how to rotate a rectangle using transformation. The RenderTransform property of Rectangle is responsible for transforming a rectangle such as rotating.
     

    <!--static rotate rectangle -->

            <Canvas Grid.Column="2" Grid.Row="3" HorizontalAlignment="Left" Margin="50,20,0,0">

                <Rectangle Width="150" Height="150" Stroke="#FFBF4343" Canvas.Left="10" Canvas.Top="10" StrokeThickness="4" RenderTransformOrigin="0.5,0.5">

                    <Rectangle.RenderTransform>

                        <TransformGroup>

                            <ScaleTransform ScaleX="1" ScaleY="1"/>

                            <SkewTransform AngleX="0" AngleY="0"/>

                            <RotateTransform Angle="30.704"/>

                            <TranslateTransform X="0" Y="0"/>

                        </TransformGroup>

                    </Rectangle.RenderTransform>

                    <Rectangle.Fill>

                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

                            <GradientStop Color="#FF000000" Offset="0"/>

                            <GradientStop Color="#FF1E1919" Offset="1"/>

                        </LinearGradientBrush>

                    </Rectangle.Fill>

                </Rectangle>

            </Canvas>

            <TextBlock Grid.Column="2" Grid.Row="3" HorizontalAlignment="Center">Static Rotate Rectangle</TextBlock>

    Result:


    Figure 8.

For more information see attached project. This is it.

posted @ 2008-11-22 13:12  Peach  阅读(2504)  评论(0编辑  收藏  举报