2014-04-07 12 views

Odpowiedz

22

Można to zrobić w XAML za pomocą VisualBrush. Wystarczy tylko podać wartości dane dla Path, na przykład:

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

Do konwersji Image do grafiki wektorowej (path) używać Inkscape, która jest darmowa i bardzo przydatna ful. Aby uzyskać więcej informacji, zobacz ten link:

Vectorize Bitmaps to XAML using Potrace and Inkscape

Edit

dla lepszej wydajności, możesz Freeze() ty Szczotki z pomocą PresentationOptions tak:

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

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

Cytat MSDN:

Gdy nie trzeba już modyfikować zamrożenia, zapewnia ono korzyści związane z wydajnością. Jeśli w tym przykładzie miałbyś zamrozić pędzel, system graficzny nie musiałby już go monitorować w celu wprowadzenia zmian. System graficzny może również wykonywać inne optymalizacje, ponieważ wie, że pędzel się nie zmieni.

+0

Dzięki Anatolij, jak drogie to jest? Użyję tego na 100 prostokątach. – Vahid

+0

@Vahid Utwórz szablon i używaj go w ten sposób zamiast pojedynczo dla każdej instancji. –

+1

@Vahid: Myślę, że powinieneś przede wszystkim spróbować zrobić to na korzyść XAML, a nie za dużo czasu. Zasadniczo WPF jest zoptymalizowany do pracy z grafiką wektorową, więc możesz zamrozić 'VisualBrush' przy pomocy' PresentationOptions', tak jak poniżej: 'PresentationOptions: Freeze =" True "'. Aby uzyskać więcej informacji, zobacz ten ['link'] (http://www.codeproject.com/Articles/22716/Graphic-in-XAML-and-WPF). –

6

Oto inne podejście, na innym stylu wylęgu:

<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>