如何使按钮在WPF中成为自定义路径?

时间:2014-10-29 14:58:08

标签: wpf button path shape

我有一个按钮,使用下面的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>

但是当我单击我的应用程序中的按钮时,它不是概述路径而是原始按钮。

我无法弄清楚如何让按钮反映路径本身。非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分: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触发器更改路径的笔划。

另外,您可能希望在两个模板的路径上将Stretch设置为UniformUniformToFill会导致剪辑。

答案 1 :(得分:0)

您是否尝试过将Path和文本块放在一起:

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