Freigeben über


Gewusst wie: Beibehalten des Seitenverhältnisses bei einem als Hintergrund verwendeten Bild

Aktualisiert: November 2007

In diesem Beispiel wird gezeigt, wie mithilfe der Stretch-Eigenschaft eines ImageBrush-Objekts das Seitenverhältnis eines Bildes beibehalten wird.

Wenn Sie mit einem ImageBrush einen Bereich zeichnen, wird dessen Inhalt standardmäßig so gestreckt, dass er den Ausgabebereich vollständig ausfüllt. Wenn der Ausgabebereich und das Bild unterschiedliche Seitenverhältnisse aufweisen, wird das Bild durch dieses Strecken verzerrt.

Damit ein ImageBrush das Seitenverhältnis beibehält, müssen Sie für die Stretch-Eigenschaft Uniform oder UniformToFill festlegen.

Beispiel

Im folgenden Beispiel werden zwei ImageBrush-Objekte verwendet, um zwei Rechtecke zu zeichnen. Jedes Rechteck ist 300 x 150 Pixel groß und enthält jeweils ein 300 x 300 Pixel großes Bild. Für die Stretch-Eigenschaft des ersten Pinsels wird Uniform und für die Stretch-Eigenschaft des zweiten Pinsels UniformToFill festgelegt.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows.Shapes;

namespace Microsoft.Samples.Graphics.UsingImageBrush
{
    /// <summary>
    /// Demonstrates different ImageBrush Stretch settings.
    /// </summary>
    public class StretchModes : Page
    {
        public StretchModes()
        {

            // Create an ImageBrush with its Stretch
            // property set to Uniform. The image it
            // contains will be expanded as much as possible
            // to fill the output area while still
            // preserving its aspect ratio.
            ImageBrush uniformBrush = new ImageBrush();
            uniformBrush.ImageSource = 
                new BitmapImage(new Uri("sampleImages\\square.jpg", UriKind.Relative));
            uniformBrush.Stretch = Stretch.Uniform;

            // Freeze the brush (make it unmodifiable) for performance benefits.
            uniformBrush.Freeze();

            // Create a rectangle and paint it with the ImageBrush.
            Rectangle rectangle1 = new Rectangle();
            rectangle1.Width = 300;
            rectangle1.Height = 150;
            rectangle1.Stroke = Brushes.MediumBlue;
            rectangle1.StrokeThickness = 1.0;
            rectangle1.Fill = uniformBrush;

            // Create an ImageBrush with its Stretch
            // property set to UniformToFill. The image it
            // contains will be expanded to completely fill
            // the rectangle, but its aspect ratio is preserved.
            ImageBrush uniformToFillBrush = new ImageBrush();
            uniformToFillBrush.ImageSource =
                new BitmapImage(new Uri("sampleImages\\square.jpg", UriKind.Relative));
            uniformToFillBrush.Stretch = Stretch.UniformToFill;

            // Freeze the brush (make it unmodifiable) for performance benefits.
            uniformToFillBrush.Freeze();

            // Create a rectangle and paint it with the ImageBrush.
            Rectangle rectangle2 = new Rectangle();
            rectangle2.Width = 300;
            rectangle2.Height = 150;
            rectangle2.Stroke = Brushes.MediumBlue;
            rectangle2.StrokeThickness = 1.0;
            rectangle2.Margin = new Thickness(0, 10, 0, 0);
            rectangle2.Fill = uniformToFillBrush;

            StackPanel mainPanel = new StackPanel();
            mainPanel.Children.Add(rectangle1);
            mainPanel.Children.Add(rectangle2);

            Content = mainPanel;
            Background = Brushes.White;
            Margin = new Thickness(20);
            Title = "ImageBrush Stretch Modes";


        }
    }
}
<!-- Demonstrates different ImageBrush Stretch settings.-->
<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="https://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions"
  Background="White" Margin="20"
  Title="ImageBrush Stretch Modes">
  <StackPanel>

    <!-- The ImageBrush in this example has its
         Stretch property set to Uniform. As a result,
         the image it contains is expanded as much as possible
         to fill the rectangle while
         still preserving its aspect ratio.-->
    <Rectangle
      Width="300" Height="150" 
      Stroke="MediumBlue" StrokeThickness="1">
      <Rectangle.Fill>
        <ImageBrush
          Stretch="Uniform" ImageSource="sampleImages\square.jpg"
          PresentationOptions:Freeze="True" />
      </Rectangle.Fill>
    </Rectangle>

    <!-- The ImageBrush in this example has its
         Stretch property set to UniformToFill. As a result,
         the image is expanded to completely fill
         the rectangle, but its aspect ratio is preserved.-->
    <Rectangle
      Width="300" Height="150"
      Stroke="MediumBlue" StrokeThickness="1"
      Margin="0,10,0,0">
      <Rectangle.Fill>
        <ImageBrush 
          Stretch="UniformToFill" ImageSource="sampleImages\square.jpg" 
          PresentationOptions:Freeze="True" />
      </Rectangle.Fill>
    </Rectangle>
  </StackPanel>
</Page>

Die folgende Abbildung zeigt die Ausgabe des ersten Pinsels, bei dem für Stretch der Wert Uniform festgelegt ist.

ImageBrush mit Uniform-Dehnung

Die nächste Abbildung zeigt die Ausgabe des zweiten Pinsels, bei dem für Stretch der Wert UniformToFill festgelegt ist.

ImageBrush mit UniformToFill-Dehnung

Beachten Sie, dass sich die Stretch-Eigenschaft bei den anderen TileBrush-Objekten (d.h. DrawingBrush und VisualBrush) genauso verhält. Weitere Informationen über ImageBrush und die anderen TileBrush-Objekte finden Sie unter Zeichnen mit Bildern, Zeichnungen und visuellen Elementen.

Beachten Sie auch, dass die Stretch-Eigenschaft zwar anzugeben scheint, wie der TileBrush-Inhalt gestreckt wird, damit er in den Ausgabebereich passt, dass sie tatsächlich aber angibt, wie der TileBrush-Inhalt gestreckt wird, damit er die Basisfläche ausfüllt. Weitere Informationen finden Sie unter TileBrush.

Dieses Codebeispiel ist Teil eines umfangreicheren Beispiels für die ImageBrush-Klasse. Das vollständige Beispiel finden Sie unter Beispiel zu ImageBrush.

Siehe auch

Konzepte

Zeichnen mit Bildern, Zeichnungen und visuellen Elementen

Referenz

TileBrush