Кадрирование геометрии

25

Как уже было показано, классы геометрии предоставляют наиболее мощный способ создания фигур. Однако геометрии не ограничены элементом Path. Они также используются везде, где нужно применить абстрактное определение фигуры (вместо рисования реальной конкретной фигуры в окне).

Другое применение геометрии предусматривает установку свойства Clip, которое поддерживается всеми элементами. Свойство Clip позволяет ограничить внешние границы элемента, чтобы он уместился в определенную геометрию. Свойство Clip можно использовать для создания множества экзотических эффектов. Хотя обычно оно применяется для обрезания содержимого графического изображения в элементе Image, это свойство допускается использовать с любым элементом. Единственное условие: нужна замкнутая геометрия, если действительно необходимо увидеть что-либо; отдельные кривые и прямолинейные сегменты не слишком полезны в данном отношении.

В следующем примере определяется одна геометрия, используемая для кадрирования двух элементов: элемента Image, содержащего растровое изображение, и стандартного элемента Button:

<Window.Resources>
    <GeometryGroup x:Key="clipGeometry" FillRule="Nonzero">
      <EllipseGeometry RadiusX="75" RadiusY="50" Center="100,150"></EllipseGeometry>
      <EllipseGeometry RadiusX="100" RadiusY="25" Center="200,150"></EllipseGeometry>
      <EllipseGeometry RadiusX="75" RadiusY="130" Center="140,140"></EllipseGeometry>
    </GeometryGroup>
  </Window.Resources>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition></ColumnDefinition>
      <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Button Clip="{StaticResource clipGeometry}">A button</Button>
    <Image Grid.Column="1" Clip="{StaticResource clipGeometry}" 
           Stretch="None"  Source="creek.jpg"></Image>
  </Grid>
Кадрирование двух элементов

С кадрированием связано одно ограничение — размеры элемента во внимание не принимаются. Другими словами, если кнопка на рисунке станет больше или меньше при изменении размера окна, то кадрированная область останется прежней и отобразит другую часть кнопки. Возможным решением может быть помещение элемента в Viewbox, который обеспечит автоматическое масштабирование. Однако это приведет к тому, что все пропорционально поменяет размер, включая детали, которые необходимо изменить (вырезанная область и поверхность кнопки), и те, которые изменять не нужно (текст кнопки и линия, очерчивающая ее границу).

Пройди тесты
Лучший чат для C# программистов