Создание шаблона штриховки в WPF

Мне удалось создать шаблоны stripe в WPF, но как я могу создать такой шаблон в XAML? Есть ли по умолчанию подобная кисть для этого в WPF?

enter image description here

Ответ 1

Вы можете сделать это в XAML, используя VisualBrush. Вам нужно указать только значения данных для Path, например:

XAML

<Window.Resources>
    <VisualBrush x:Key="MyVisualBrush" TileMode="Tile" Viewport="0,0,15,15" ViewportUnits="Absolute" Viewbox="0,0,15,15" ViewboxUnits="Absolute">
        <VisualBrush.Visual>
            <Grid Background="Black">
                <Path Data="M 0 15 L 15 0" Stroke="Gray" />
                <Path Data="M 0 0 L 15 15" Stroke="Gray" />
            </Grid>
        </VisualBrush.Visual>
    </VisualBrush>
</Window.Resources>

<Grid Background="{StaticResource MyVisualBrush}">
    <Label Content="TEST" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

Output

enter image description here

Для преобразования Image в векторную графику (путь) используйте Inkscape, что является бесплатным и очень полезным. Для получения дополнительной информации см. Эту ссылку:

Vectorize Bitmaps to XAML using Potrace and Inkscape

Edit

Для повышения производительности вы можете Freeze() использовать кисти с помощью PresentationOptions следующим образом:

<Window x:Class="MyNamespace.MainWindow"
        xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" ...>

    <VisualBrush x:Key="MyVisualBrush" PresentationOptions:Freeze="True" ... />

Цитата из MSDN:

Когда вам больше не нужно модифицировать замораживаемое, замораживание обеспечивает преимущества производительности. Если вы хотите заморозить кисть в этом примере, графической системе больше не нужно будет отслеживать ее для изменений. Графическая система также может выполнять другие оптимизации, поскольку она знает, что кисть не изменится.

Ответ 2

Здесь другой подход, для другого стиля штриховки:

mzFD4.png

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:po="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
  Background="Black">

  <Page.Resources>

    <VisualBrush x:Key="HatchBrush" TileMode="Tile"
                 Viewport="0,0,5,5" ViewportUnits="Absolute"
                 Viewbox="0,0,5,5" ViewboxUnits="Absolute"
                 po:Freeze="True">
      <VisualBrush.Visual>
        <Path Data="M 0 5 L 5 0 M -2 2 L 2 -2 M 3 7 L 7 3"
              Stroke="#80ffffff" StrokeEndLineCap="Square"
              RenderOptions.EdgeMode="Aliased" />
      </VisualBrush.Visual>
    </VisualBrush>

  </Page.Resources>

  <Grid Background="{StaticResource HatchBrush}" />

</Page>