2009-05-08 34 views
13

Tôi có một con đường (một con số sao):Tái sử dụng con đường đối tượng trong 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> 

Bây giờ tôi muốn lặp lại con đường này nhiều lần (chỉ đề cập đến "NiceStar"). Tôi có thể làm điều này trong XAML thuần túy không?

tôi có thể sử dụng nó một lần, bằng cách làm này:

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

Tuy nhiên, tôi không thể lặp lại dòng này. Trình biên dịch của tôi cho biết:

Phần tử được chỉ định đã là con hợp lý của một phần tử khác. Ngắt kết nối nó trước.

Trả lời

21

Tạo một phong cách.

<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

điều này dường như không hoạt động. bộ dữ liệu 'data' không phân tích cú pháp chính xác. – bc3tech

7

Chắc chắn, chỉ cần xác định một phong cách cho đường dẫn và sau đó bạn có thể tái sử dụng nó như là một nguồn tài nguyên tĩnh:

<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

Thật buồn ... Tôi đã làm việc theo phong cách khi tiêu đề cho biết câu trả lời đã được đăng. Tôi muốn kết thúc câu trả lời trước khi tải. Làm tốt lắm, bạn đánh tôi với cú đấm! :-) –

+0

Thanks anyway cho câu trả lời của bạn! –

+0

điều này dường như không hoạt động trong các bản XAML mới nhất. Bộ dữ liệu 'Data' không được phân tích/áp dụng như bạn mong đợi. – bc3tech

6

Trong một thông báo liên quan, (mặc dù có lẽ không trực tiếp trả lời các câu hỏi của bạn), bạn cũng có thể khai báo một FrameworkElement như một tài nguyên, cung cấp cho nó một phím, và chừng nào khi bạn thêm x:Shared="False", bạn có thể truy cập lại tài nguyên bằng mã.

Dưới đây là một ví dụ 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> 

Sau đó, trong mã, bạn có thể truy cập vào hình dạng nguồn lực và tái sử dụng nó nhiều lần khi cần thiết.

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

[ah] (http://msdn.microsoft.com/en-us/library/aa970778.aspx), cảm ơn bạn rất nhiều. –

3

Tôi sẽ chuyển đường dẫn thành DrawingBrush. Điều này thực sự dễ làm trong pha trộn, chỉ cần chọn đường dẫn, Công cụ> Tạo tài nguyên Brush> Tạo tài nguyên DrawingBrush. Sau đó, bạn sẽ có bàn chải trong tài nguyên của bạn, sẵn sàng để tái sử dụng. Tôi hy vọng hiệu suất của điều này sẽ khá tốt, vì cọ vẽ không tương tác và có thể tái sử dụng được.

Đây là 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> 

lựa chọn khác là để biến bọc các đường dẫn vào một ImageSource sử dụng DrawingImage

2

Bạn có thể sử dụng phong cách với một mẫu kiểm soát cho điều này

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

Và sau đó sử dụng nó:

<Button> 
    <Control Style="{StaticResource FolderIcon}"/> 
</Button> 
Các vấn đề liên quan