如何使按钮形状在WPF自定义路径?(How do I make a button shape a c

2019-11-03 09:28发布

我使用下面的ControlTemplate中有一个按钮。

<ControlTemplate x:Key="ControlTemplate" TargetType="{x:Type Button}">
        <Grid>
            <Path x:Name="ButtonPath" Fill="{Binding IsSelected, Converter={StaticResource ArrowBackgroundColorConverter}, UpdateSourceTrigger=PropertyChanged}"  
                  Data="{Binding Converter={StaticResource ArrowPathSelector}}" Stretch="UniformToFill" Margin="0 0 -35 0"></Path>
            <TextBlock Grid.Column="0" Grid.Row="0" FontFamily="{StaticResource ApplicationFont}" FontSize="{StaticResource Heading3}" HorizontalAlignment="Center" Margin="35 0 0 0" VerticalAlignment="Center" Text="{Binding Title}" Foreground="White"/>
        </Grid>
    </ControlTemplate>

但是当我点击我的应用程序的按钮,它没有勾勒路径,而是原始的按钮。

我不能完全弄清楚如何获得按钮以反映路径本身。 任何帮助非常感谢,谢谢!

Answer 1:

如果你想改变焦点矩形的形状(虚线边框指示键盘焦点),你需要创建一个自定义FocusVisualStyle ,在相同形状的按钮,内容绘制虚线路径:

<Style x:Key="ButtonFocusRectangle" TargetType="Control">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Path Stroke="Black"
              StrokeDashArray="2 2"  
              Data="M 0,0 50,50 100,0 Z"
              Stretch="UniformToFill"
              Margin="0 0 -35 0" />
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

然后,在按钮上,设置FocusVisualStyle="{StaticResource ButtonFocusRectangle}" 请注意,它可能会更清洁,来定义Style的按钮,并且有它同时应用TemplateFocusVisualStyle你。

或者,你可以摆脱视觉焦点完全通过设定FocusVisualStyle="{x:Null}" 。 您可能会选择这样做,简单地画一个焦点暗示对你的日常Template通过,例如,改变路径的笔触与IsKeyboardFocused触发。

顺便说一句,你可能需要设置StretchUniform在两个模板的路径。 UniformToFill可引起削波。



Answer 2:

你试图把你的路径和你的文本块周围的其他方法:

<ControlTemplate x:Key="ControlTemplate" TargetType="{x:Type Button}">
    <Grid>
        <TextBlock Grid.Column="0" Grid.Row="0" FontFamily="{StaticResource ApplicationFont}" FontSize="{StaticResource Heading3}" HorizontalAlignment="Center" Margin="35 0 0 0" VerticalAlignment="Center" Text="{Binding Title}" Foreground="White"/>
        <Path x:Name="ButtonPath" Fill="{Binding IsSelected, Converter={StaticResource ArrowBackgroundColorConverter}, UpdateSourceTrigger=PropertyChanged}"  
              Data="{Binding Converter={StaticResource ArrowPathSelector}}" Stretch="UniformToFill" Margin="0 0 -35 0"></Path>
    </Grid>
</ControlTemplate>


文章来源: How do I make a button shape a custom Path in WPF?