2009-05-08 2 views
13

У меня есть путь (звезда рисунок):Повторное использование объекта путь в 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> 

Теперь я хочу, чтобы дублировать этот путь несколько раз (как раз ссылаюсь на «NiceStar»). Могу ли я сделать это в чистом XAML?

я могу использовать его один раз, делая это:

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

Однако, я не могу дублировать эту строку. Мой компилятор говорит:

Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его.

ответ

21

Создать стиль.

<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

это не работает. наборщик данных не корректно обрабатывается. – bc3tech

7

Конечно, просто определить стиль для пути, а затем вы можете использовать его в качестве статического ресурса:

<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

Это печально ... Я работал над стилем, когда заголовок сказал, что ответ был опубликован. Я хотел закончить свой ответ перед загрузкой. Хорошая работа, ты избил меня до удара! :-) –

+0

Спасибо в любом случае за ваш ответ! –

+0

, похоже, не работает в последних версиях XAML. Установщик 'Data' не анализируется и не применяется, как вы ожидали. – bc3tech

6

В связи с этим отметить, (хотя, возможно, непосредственно не отвечая на ваш вопрос), вы можете также объявить FrameworkElement как ресурс, дать ему ключ, и до тех пор, по мере добавления x:Shared="False" вы можете снова и снова получать доступ к ресурсу в коде.

Вот 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> 

Затем в коде, вы можете получить доступ к форме и ограниченными ресурсами использовать его столько раз, сколько необходимо.

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

[ah] (http://msdn.microsoft.com/en-us/library/aa970778.aspx), большое вам спасибо. –

3

Я бы повернул путь в DrawingBrush. Это действительно легко сделать в blend, просто выберите путь, Tools> Make Brush Resource> Make DrawingBrush Resource. Тогда у вас будет кисть в ваших ресурсах, готовая к повторному использованию. Я ожидаю, что производительность этого будет довольно хорошей, так как кисть не является интерактивной и многоразовой.

Вот 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> 

Другой вариант, чтобы превратить Оберните путь в ImageSource с помощью DrawingImage

2

Вы можете использовать стиль с шаблоном управления для этого

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

И затем используйте его:

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