2009-05-08 11 views
13

Mam ścieżki (A rysunek gwiazdki):Reuse ścieżka obiektu w XAML

<Path x:Name="NiceStar" StrokeThickness="10" Stroke="#ff000000" StrokeMiterLimit="1" Data="F1 M 126.578613,11.297852 L 162.373535,83.825684 L 242.412598,95.456055 L 184.495605,151.911133 L 198.167480,231.626953 L 126.578613,193.990234 L 54.988770,231.626953 L 68.661621,151.911133 L 10.744629,95.456055 L 90.783691,83.825684 L 126.578613,11.297852 Z"> 
    <Path.Fill> 
     <RadialGradientBrush MappingMode="Absolute" GradientOrigin="390.395508,448.130371" Center="390.395508,448.130371" RadiusX="113.034821" RadiusY="113.034821"> 
      <RadialGradientBrush.Transform> 
       <MatrixTransform Matrix="1,0,-0,-1,-263.816895,569.592773" /> 
      </RadialGradientBrush.Transform> 
      <GradientStop Offset="0" Color="#ff00ff00"/> 
      <GradientStop Offset="1" Color="#ff006736"/> 
     </RadialGradientBrush> 
    </Path.Fill> 
</Path> 

Teraz chcę powielać tej ścieżce kilka razy (tylko odnosząc się do "NiceStar"). Czy mogę to zrobić w czystym XAML?

mogę go użyć raz, w ten sposób:

<Decorator Child="{StaticResource star}" /> 

Jednak nie mogę powielać tę linię. Mój kompilator mówi:

Określony element jest już logicznym potomkiem innego elementu. Odłącz najpierw.

Odpowiedz

21

Tworzenie stylu.

<Style x:Key="NiceStarPath" TargetType="{x:Type Path}"> 
    <Setter Property="StrokeThickness" Value="10"/> 
    <Setter Property="Stroke" Value="#FF000000"/> 
    <Setter Property="StrokeMiterLimit" Value="1"/> 
    <Setter Property="Data" Value="F1 M 126.578613,11.297852 L 162.373535,83.825684 L 242.412598,95.456055 L 184.495605,151.911133 L 198.167480,231.626953 L 126.578613,193.990234 L 54.988770,231.626953 L 68.661621,151.911133 L 10.744629,95.456055 L 90.783691,83.825684 L 126.578613,11.297852 Z"/> 
    <Setter Property="Fill"> 
     <Setter.Value> 
      <RadialGradientBrush MappingMode="Absolute" GradientOrigin="390.395508,448.130371" Center="390.395508,448.130371" RadiusX="113.034821" RadiusY="113.034821"> 
       <RadialGradientBrush.Transform> 
        <MatrixTransform Matrix="1,0,-0,-1,-263.816895,569.592773" /> 
       </RadialGradientBrush.Transform> 
       <GradientStop Offset="0" Color="#ff00ff00"/> 
       <GradientStop Offset="1" Color="#ff006736"/> 
      </RadialGradientBrush> 
     </Setter.Value> 
    </Setter> 
</Style> 

...

<Path Style="{StaticResource NiceStarPath}"/> 
+0

to nie wydaje się działać. setter danych nie jest poprawnie analizowany. – bc3tech

7

Jasne, wystarczy zdefiniować styl dla ścieżki, a następnie można używać go jako zasób statycznej:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Page.Resources> 
    <Style x:Key="StarStyle" TargetType="Path"> 
    <Setter> 
     <Setter.Property>Fill</Setter.Property> 
     <Setter.Value>     
      <RadialGradientBrush MappingMode="Absolute" 
       GradientOrigin="390.395508,448.130371" Center="390.395508,448.130371" 
       RadiusX="113.034821" RadiusY="113.034821"> 
      <RadialGradientBrush.Transform> 
       <MatrixTransform Matrix="1,0,-0,-1,-263.816895,569.592773" /> 
      </RadialGradientBrush.Transform> 
      <GradientStop Offset="0" Color="#ff00ff00"/> 
      <GradientStop Offset="1" Color="#ff006736"/> 
      </RadialGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="StrokeThickness" Value="10" /> 
    <Setter Property="Stroke" Value="#ff000000" /> 
    <Setter Property="StrokeMiterLimit" Value="1" /> 
    <Setter Property="Data" Value="F1 M 126.578613,11.297852 L 162.373535,83.825684 L 242.412598,95.456055 L 184.495605,151.911133 L 198.167480,231.626953 L 126.578613,193.990234 L 54.988770,231.626953 L 68.661621,151.911133 L 10.744629,95.456055 L 90.783691,83.825684 L 126.578613,11.297852 Z"/> 
    </Style> 
</Page.Resources> 
<StackPanel> 
    <Path Style="{StaticResource StarStyle}" /> 
    <Path Style="{StaticResource StarStyle}" /> 
</StackPanel> 
</Page> 
+1

To smutne ... Pracowałem nad stylem, gdy nagłówek powiedział, że odpowiedź została opublikowana. Chciałem ukończyć moją odpowiedź przed załadowaniem. Dobra robota, pokonałeś mnie na pięści! :-) –

+0

Dzięki za odpowiedź! –

+0

to nie wydaje się działać w najnowszych obrotach XAML. Narzędzie ustawiające "Dane" nie jest analizowane/stosowane zgodnie z oczekiwaniami. – bc3tech

6

W pokrewnym notatki, (choć prawdopodobnie nie bezpośrednio odpowiadając na pytanie), można również zadeklarować FrameworkElement jako zasób, nadać mu klucz i jak długo podczas dodawania x:Shared="False" możesz uzyskać dostęp do zasobu raz za razem w kodzie.

Oto pseudocoded przykład:

<Window ....> 
    <Window.Resources> 
     <Ellipse x:Key="ReusableEllipse" x:Shared="False" ...> 
     <Ellipse.Fill> 
      <!--STUFF--> 
     </Ellipse.Fill> 
     </Ellipse> 
    </Window.Resources> 
    <Canvas x:Name="drawCanvas" Background="White"/> 
</Window> 

Następnie w kodzie, można uzyskać dostęp do zasobów na kształt i używać go tyle razy, ile potrzeba.

Ellipse tempRect = (Ellipse)FindResouce("ReusableEllipse"); 
+0

[ah] (http://msdn.microsoft.com/en-us/library/aa970778.aspx), dziękuję bardzo. –

3

Zmieniłbym ścieżkę w DrawingBrush. To jest naprawdę łatwe do zrobienia w mieszance, wystarczy wybrać ścieżkę, Narzędzia> Utwórz zasób pędzla> Utwórz zasób DrawingBrush. Wtedy będziesz miał pędzel w swoich zasobach, gotowy do ponownego użycia. Oczekuję, że wydajność tego będzie całkiem dobra, ponieważ pędzel nie jest interaktywny i można go użyć ponownie.

Oto XAML:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="640" Height="480"> 
    <Window.Resources> 
     <DrawingBrush x:Key="NiceStarBrush" Viewbox="0,0,250,240" ViewboxUnits="Absolute"> 
      <DrawingBrush.Drawing> 
       <GeometryDrawing Geometry="F1M126.578613,11.297852L162.373535,83.825684 242.412598,95.456055 184.495605,151.911133 198.16748,231.626953 126.578613,193.990234 54.98877,231.626953 68.661621,151.911133 10.744629,95.456055 90.783691,83.825684 126.578613,11.297852z"> 
        <GeometryDrawing.Brush> 
         <RadialGradientBrush MappingMode="Absolute" Center="390.395508,448.130371" GradientOrigin="390.395508,448.130371" RadiusX="113.034821" RadiusY="113.034821"> 
          <RadialGradientBrush.Transform> 
           <MatrixTransform Matrix="1,0,0,-1,-263.816895,569.592773"/> 
          </RadialGradientBrush.Transform> 
          <GradientStop Color="Lime" Offset="0"/> 
          <GradientStop Color="#FF006736" Offset="1"/> 
         </RadialGradientBrush> 
        </GeometryDrawing.Brush> 
        <GeometryDrawing.Pen> 
         <Pen Brush="Black" DashCap="Flat" EndLineCap="Flat" LineJoin="Miter" MiterLimit="1" StartLineCap="Flat" Thickness="10"> 
          <Pen.DashStyle> 
           <DashStyle/> 
          </Pen.DashStyle> 
         </Pen> 
        </GeometryDrawing.Pen> 
       </GeometryDrawing> 
      </DrawingBrush.Drawing> 
     </DrawingBrush> 
    </Window.Resources> 
    <Grid x:Name="LayoutRoot"> 
     <Rectangle Margin="181,115,0,0" Fill="{DynamicResource NiceStarBrush}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="50" Height="46" /> 
    </Grid> 
</Window> 

Inną opcją jest, aby włączyć zawinąć ścieżkę do w ImageSource wykorzystaniem DrawingImage

2

można użyć stylu z szablonu kontroli dla tego

<Style TargetType="Control" x:Key="FolderIcon"> 
    <Setter Property="IsTabStop" Value="False"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Path Data="M -1,0 h 5 M 0,3 h 10 v 5 h -10 Z" StrokeThickness="2" Stroke="White" Fill="White" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

A następnie użyj go:

<Button> 
    <Control Style="{StaticResource FolderIcon}"/> 
</Button>