2017-06-22 4 views
0

私はWPFのボタンを置き換えるジオメトリを構築するためにパスジオメトリグループを使用します。WPFパスジオメトリスタイル

<UserControl.Resources> 

    <ControlTemplate x:Key="bT" TargetType="Button"> 

     <Path StrokeThickness="1.5" > 
      <Path.Data> 
       <GeometryGroup> 
        <EllipseGeometry Center="7,7" RadiusX="7" RadiusY="7" /> 
        <LineGeometry StartPoint="4,4" EndPoint="10,10" /> 
        <LineGeometry StartPoint="10,4" EndPoint="4,10" /> 
       </GeometryGroup> 
      </Path.Data> 

      <Path.Style> 

       <Style TargetType="{x:Type Path}"> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="False"> 
          <Setter Property="Stroke" Value="LightGray" /> 
         </Trigger> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Stroke" Value="Red" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </Path.Style> 

     </Path> 
    </ControlTemplate> 

</UserControl.Resources> 

ボタンを

<Button Template="{StaticResource ResourceKey=bT}" /> 

のように実装されている今、私の問題があります私は異なる色で私のジオメトリをスタイルすることはできません。たとえば、私は自分のEllipseGeometryの動作をLineGeometriesのものよりも欲しいと思っています。 これには方法がありますか?

答えて

2

ControlTemplateに複数の名前付きパスがあり、IsMouseOverトリガーをControlTemplate.Triggersに移動し、セッターでTargetNameを使用します。また、ControlTemplateのすべてのパスにデフォルトのスタイルがあることに注意してください。

<ControlTemplate TargetType="Button" x:Key="bT"> 
    <ControlTemplate.Resources> 
     <Style TargetType="Path"> 
      <Setter Property="Fill" Value="Transparent"/> 
      <Setter Property="Stroke" Value="LightGray"/> 
      <Setter Property="StrokeThickness" Value="1.5"/> 
     </Style> 
    </ControlTemplate.Resources> 

    <Canvas> 
     <Path x:Name="circle"> 
      <Path.Data> 
       <EllipseGeometry Center="7,7" RadiusX="7" RadiusY="7"/> 
      </Path.Data> 
     </Path> 
     <Path x:Name="cross"> 
      <Path.Data> 
       <GeometryGroup> 
        <LineGeometry StartPoint="4,4" EndPoint="10,10"/> 
        <LineGeometry StartPoint="10,4" EndPoint="4,10"/> 
       </GeometryGroup> 
      </Path.Data> 
     </Path> 
    </Canvas> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="circle" Property="Stroke" Value="Red"/> 
      <Setter TargetName="cross" Property="Stroke" Value="Green"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

crossパスもPath Markup Syntaxを使用することによって短く書くことができます。

<Path x:Name="cross" Data="M4,4 L10,10 M4,10 L10,4"/> 
+0

これは私にとって非常に良さそうに見えます。しかし、私にはまだ2つのポイントがあります: 十字と円の間の空きスペースはクリックできません。そこに透明なジオメトリを入れるよりもスマートな解決策がありますか? また、私は十字架のために切り取られたあなたの短いコードを理解していません。どうすれば "M4,4 L10,10 M4,10 L10,4"を読むことができますか? –

+1

最初のポイントには、デフォルトのパススタイルで ''があります。デフォルトのFillはnullです。つまり、ヒットテストが可視ではありません。また、キャンバス上に透明な 'Background'を設定して、ボタン全体のヒットテストを可視にすることもできます。 2番目の点については、[パスマークアップの構文](https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/path-markup-syntax)を参照してください。 – Clemens

+1

偉大な、すべてが非常によく実行されています。どうもありがとうございました! –