2009-05-08 11 views
13

que tiene un camino (una figura de estrella):reutilización objeto de trazado en 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> 

Ahora quiero duplicar este camino varias veces (solo refiriéndose a "NiceStar"). ¿Puedo hacer esto en XAML puro?

puedo usar una vez, al hacer esto:

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

Sin embargo, no puedo duplicar esta línea. Mi compilador dice:

El elemento especificado ya es el elemento lógico de otro elemento. Desconectarlo primero.

Respuesta

21

crear un estilo.

<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

esto no parece funcionar. el setter 'data' no se analiza correctamente. – bc3tech

7

Claro, sólo definir un estilo para el camino y luego puede volver a utilizarla como un recurso estático:

<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

Eso es triste ... Estaba trabajando en el estilo cuando el encabezado decía que se había publicado una respuesta. Quería terminar mi respuesta antes de cargar. Buen trabajo, ¡me ganaste al golpe! :-) –

+0

Gracias de todos modos por su respuesta! –

+0

esto no parece funcionar en las últimas revoluciones de XAML. El setter 'Data' no se analiza ni se aplica como cabría esperar. – bc3tech

6

En una nota relacionada, (aunque probablemente no responder directamente a su pregunta), también se puede declarar un FrameworkElement como recurso, darle una llave, y mientras cuando agrega x:Shared="False", puede acceder al recurso una y otra vez en el código.

Aquí está un ejemplo pseudocoded:

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

Luego, en el código, puede acceder a la forma recursos y reutilizar tantas veces como sea necesario.

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

[ah] (http://msdn.microsoft.com/en-us/library/aa970778.aspx), muchas gracias. –

3

Me gustaría convertir el camino en un DrawingBrush. Esto es realmente fácil de hacer en combinación, solo seleccione la ruta, Herramientas> Hacer recurso de pincel> Crear recurso de punta de empuje. Entonces tendrás el pincel en tus recursos, listo para volver a usar. Espero que el rendimiento de esto sea bastante bueno, ya que el pincel no es interactivo y reutilizable.

Aquí es el 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> 

Otra opción es convertir envoltura de la ruta en un Imagesource usando DrawingImage

2

Usted puede utilizar el estilo con una plantilla de control para este

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

Y luego úselo:

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