2013-07-25 87 views
1

我很新的WPF。下面是我試圖做的,以便使用相同的controlTemplate按鈕,它們之間的唯一區別是PathGeometry值。如何使用相同的按鈕相同的模板

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Shared.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 

    <Style TargetType="Button" x:Key="buttonHeader"> 
     <Setter Property="Width" Value="18" /> 
     <Setter Property="Height" Value="18" /> 
     <Setter Property="Cursor" Value="Hand" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Border Name="BorderStyle" Background="Transparent" > 
         <Path 
          x:Name="CheckMark" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Bottom" 
          SnapsToDevicePixels="False" 
          Stroke="#FF4D4D4D" 
          StrokeThickness="2" StrokeEndLineCap="Flat" StrokeStartLineCap="Flat" 
          Data="{DynamicResource geoPath}"> 
         </Path> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="true"> 
          <Setter TargetName="BorderStyle" Property="Background" Value="#B2FFFFFF" /> 
          <Setter TargetName="CheckMark" Property="Stroke" Value="#D8727272" /> 
         </Trigger> 
         <Trigger Property="IsPressed" Value="true"> 
          <Setter TargetName="BorderStyle" Property="Background" Value="#B2707070" /> 
          <Setter TargetName="CheckMark" Property="Stroke" Value="#D8FFFFFF" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <PathGeometry x:Key="X_Sign"> 
     <PathFigure StartPoint="0,0"> 
      <LineSegment Point="10,10"/> 
     </PathFigure> 
     <PathFigure StartPoint="0,10"> 
      <LineSegment Point="10,0"/> 
     </PathFigure> 
    </PathGeometry> 

    <PathGeometry x:Key="Min_Sign"> 
     <PathFigure StartPoint="0,0"> 
      <LineSegment Point="10,0"/> 
     </PathFigure> 
    </PathGeometry> 

    <Style x:Key="ButtonX" BasedOn="{StaticResource buttonHeader}" TargetType="Button"> 
     <Style.Resources> 
      <StaticResource x:Key="geoPath" ResourceKey="X_Sign"/> 
     </Style.Resources> 
    </Style> 
    <Style x:Key="ButtonXMinimize" BasedOn="{StaticResource buttonHeader}" TargetType="Button"> 
     <Style.Resources> 
      <StaticResource x:Key="geoPath" ResourceKey="Min_Sign"/> 
     </Style.Resources> 
    </Style> 
</ResourceDictionary> 

在設計師,我真正得到正是我想要的,但是當我嘗試運行應用程序,我得到一個XamlParseException和的InnerException是:

無法投類型的對象「系統。 Windows.Media.PathGeometry'鍵入'System.Windows.ResourceDictionary'

我缺少什麼以及如何修復它? 另外,我很樂意知道是否有更好的方法來做到這一點。

在此先感謝。

回答

1

雖然直接傳遞資源的StaticResource通過不可靠地工作,XAML元素通常可以進一步分解成可重用的部分。如果你看一下PathGeometry class declaration,你會注意到它:

[ContentPropertyAttribute("Figures")] 

這意味着Figures財產實際上是被設定什麼,當你窩孩子在XAML。此屬性的類型爲PathFigureCollection,您的PathFigure元素將被添加到該屬性中。這意味着你可以自己儲存PathFigureCollection作爲一種資源:

<PathFigureCollection x:Key="XSignFigures"> 
    <PathFigure StartPoint="0,0"> 
     <LineSegment Point="10,10"/> 
    </PathFigure> 
    <PathFigure StartPoint="0,10"> 
     <LineSegment Point="10,0"/> 
    </PathFigure> 
</PathFigureCollection> 

,然後將其應用到PathGeometry當你需要它:

<Style x:Key="ButtonX" BasedOn="{StaticResource buttonHeader}" TargetType="Button"> 
    <Style.Resources> 
     <PathGeometry x:Key="geoPath" Figures="{StaticResource ResourceKey=XSignFigures}" /> 
    </Style.Resources> 
</Style> 

更多信息:http://msdn.microsoft.com/en-us/library/ms788723.aspx#collection_syntax

0

您不能將StaticResource用作實際資源(此處爲:PathGeometry)的「代理」。

你可以做的是將每個PathGeometry移動到其相應的<Style.Resources>部分。因此,你不會有任何所謂PathGeometries「X_Sign」或「Min_Sign」 - 只是兩塊被稱爲「地理路徑」:

... 

<Style x:Key="ButtonX" BasedOn="{StaticResource buttonHeader}" TargetType="Button"> 
    <Style.Resources> 
     <!--<StaticResource x:Key="geoPath" ResourceKey="X_Sign"/>--> 
     <PathGeometry x:Key="geoPath"> 
      <PathFigure StartPoint="0,0"> 
       <LineSegment Point="10,10"/> 
      </PathFigure> 
      <PathFigure StartPoint="0,10"> 
       <LineSegment Point="10,0"/> 
      </PathFigure> 
     </PathGeometry> 
    </Style.Resources> 
</Style> 
<Style x:Key="ButtonXMinimize" BasedOn="{StaticResource buttonHeader}" TargetType="Button"> 
    <Style.Resources> 
     <ResourceDictionary> 
      <!--<StaticResource x:Key="geoPath" ResourceKey="Min_Sign"/>--> 
      <PathGeometry x:Key="geoPath"> 
       <PathFigure StartPoint="0,0"> 
        <LineSegment Point="10,0"/> 
       </PathFigure> 
      </PathGeometry> 
     </ResourceDictionary> 
    </Style.Resources> 
</Style> 
+0

是的,它就像現在魅力。非常感謝你。 –