2013-02-02 20 views
5

OK, zburzyłem mój mózg, Google'a i stackoverflow próbując to zrozumieć, ale po prostu nie mogę tego dostać. Próbuję użyć DrawingBrush z grupą DrawingGroup do dwóch rzeczy na tle mojej aplikacji WPF (najnowsza wersja). Po pierwsze, chcę mieć RadialGradientBrush, aby umieścić subtelny gradient na moim tle. Ta część działa dobrze. Druga część, którą próbuję osiągnąć, to to, że chcę również powtarzać ukośne linie jako część tego tła. Wiem, że mógłbym zrobić to z obrazem, ale wolałbym używać geometrii, ponieważ próbuję uczyć się i opanować WPF. Oto, co mam do tej pory. Promieniowanie wydaje się w porządku, ale linie nie. Każda pomoc będzie doceniona.Jak utworzyć powtarzające się linie ukośne jako tło w WPF?

<Style x:Key="WindowBackground" TargetType="Grid"> 
     <Setter Property="Background"> 
      <Setter.Value> 
       <DrawingBrush> 
        <DrawingBrush.Drawing> 
         <DrawingGroup> 
          <GeometryDrawing> 
           <GeometryDrawing.Brush> 
            <RadialGradientBrush GradientOrigin="0.5,0.5" RadiusX="0.5" RadiusY="0.5"> 
             <GradientStop Color="#EE9D40" Offset="0"/> 
             <GradientStop Color="#BF8230" Offset="1"/> 
            </RadialGradientBrush> 
           </GeometryDrawing.Brush> 
           <GeometryDrawing.Geometry> 
            <RectangleGeometry Rect="0,0,1,1"/> 
           </GeometryDrawing.Geometry> 
          </GeometryDrawing> 
          <GeometryDrawing> 
           <GeometryDrawing.Brush> 
            <DrawingBrush TileMode="Tile" Stretch="None" Viewbox="0,0,1,1" Viewport="0,0,25,25" ViewportUnits="Absolute"> 
             <DrawingBrush.RelativeTransform> 
              <TranslateTransform X="0" Y="0" /> 
             </DrawingBrush.RelativeTransform> 
             <DrawingBrush.Drawing> 
              <GeometryDrawing Brush="#20FFFFFF" Geometry="M10,0 22,0 12,25 0,22 Z" /> 
             </DrawingBrush.Drawing> 
            </DrawingBrush> 
           </GeometryDrawing.Brush> 
           <GeometryDrawing.Geometry> 
            <RectangleGeometry Rect="0,0,1,1"/> 
           </GeometryDrawing.Geometry> 
          </GeometryDrawing> 
         </DrawingGroup> 
        </DrawingBrush.Drawing> 
       </DrawingBrush> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+2

Zobacz moją odpowiedź [tutaj] (http://stackoverflow.com/a/6434964/390278). Rysujemy tam siatkę, ale możesz zastosować te same pojęcia. –

+0

Nie działa to dla mnie, ale widzę, dokąd zmierzasz, więc próbuję to rozpracować. Dziękuję za odpowiedź! Ty też, Cedric. Dam ci znać. –

Odpowiedz

16

Ta sztuczka powinna zadziałać.

<LinearGradientBrush EndPoint="0,0" StartPoint="8,8" 
        MappingMode="Absolute" SpreadMethod="Repeat"> 
    <GradientStop Color="Black" Offset="0" /> 
    <GradientStop Color="Black" Offset="0.1" /> 
    <GradientStop Color="White" Offset="0.1" /> 
    <GradientStop Color="White" Offset="1" /> 
</LinearGradientBrush> 
+1

Warto wspomnieć, że jeśli chcesz szerszy pasek (tak jak ja), po prostu zwiększ dwie wartości przesunięcia "0.1". Na przykład. "0,5" da ci naprzemienne paski o jednakowej szerokości. –

1

W końcu udało mi się to zrobić, ale nie z jednym złożonym pędzlem, jakiego chciałem. Kiedyś następujące style:

<Style x:Key="WindowBackground" TargetType="Grid"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <RadialGradientBrush GradientOrigin="0.5,0.5" RadiusX="0.5" RadiusY="0.5"> 
         <GradientStop Color="#EAA659" Offset="0"/> 
         <GradientStop Color="#BF8230" Offset="1"/> 
        </RadialGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <Style x:Key="HatchOverlay" TargetType="Rectangle"> 
      <Setter Property="Fill"> 
       <Setter.Value> 
        <VisualBrush Opacity=".1" TileMode="Tile" Viewport="0,0,10,20" ViewportUnits="Absolute"> 
         <VisualBrush.Visual> 
          <Canvas> 
           <Path Stroke="#825821" Data="M 0 0 l 10 20" /> 
          </Canvas> 
         </VisualBrush.Visual> 
        </VisualBrush> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Następnie, aby włączyć go w czasie wykonywania, dodałem prostokąt jako pierwsze dziecko mojego siatki, tak jak poniżej:

<Grid Style="{StaticResource WindowBackground}"> 
    <Rectangle Style="{StaticResource HatchOverlay}"/>... 

To dało mi taki skutek, że Szukałem. Dzięki za pomoc; Będę głosował na każdego z was.

1
  • Spróbuj obracania szczotki poziomej linii, aby uniknąć luki narożne:

    <VisualBrush TileMode="Tile" 
    Viewport="0,0,5,5" ViewportUnits="Absolute" 
    Viewbox="0,0,5,5" ViewboxUnits="Absolute"> 
    <VisualBrush.Visual> 
        <Grid Background="White" Height="5"> 
         <Path Stroke="Black" Data="M 0 3 l 8 0" /> 
        </Grid> 
    </VisualBrush.Visual> 
    <VisualBrush.RelativeTransform> 
        <RotateTransform CenterX="0.5" CenterY="0.5" Angle="45" /> 
    </VisualBrush.RelativeTransform> 
    </VisualBrush> 
    
Powiązane problemy