1

我有一个ButtonControlTemplate.

它包含一个Canvas包含一个Path。我想Path.Opacity根据鼠标状态添加更改:

  • 默认 - 0.5
  • 鼠标悬停,未按下 - 1.0
  • 鼠标悬停,按下 - 0.5

第一种情况只需设置本地值Path.Opacityto0.5并添加一个Triggerfor IsMouseOver

<Button x:Class="ImagingShop.Panosphere.Controls.PathButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="100"
        Name="pathButton">

    <Button.Template>
        <ControlTemplate>
            <Canvas Background="Transparent" Width="{TemplateBinding Width}" Height="{TemplateBinding Width}">
                <Canvas.Style>
                    <Style TargetType="Canvas">
                        <Setter Property="Path.Opacity" Value="0.5"/>
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Path.Opacity" Value="1.0"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Canvas.Style>
                <Path Data="{Binding ElementName=pathButton, Path=PathData}" Stretch="Uniform" Fill="#FFFFFFFF" Width="{TemplateBinding Width}" Height="{TemplateBinding Width}"/>
            </Canvas>
        </ControlTemplate>
    </Button.Template>

    <Grid>

    </Grid>
</Button>

但是,第三种情况不起作用。我添加了以下触发器:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Property="Button.IsPressed" Value="True"/>
    </MultiTrigger.Conditions>
    <Setter Property="Path.Opacity" Value="0.75"/>
</MultiTrigger>

所以这应该设置Path.Opacity0.75鼠标悬停在按钮上按下按钮。

我坚持这一点,因为不透明度改为0.5而不是0.75!触发器似乎适用,但没有按预期工作......

4

1 回答 1

1

为什么你不直接使用Opacityof并且在'sButton上有触发器,反正你除了这个什么都没有。ButtonStyleControlTemplatePath

<Style TargetType="{x:Type local:PathButton}">
  <Setter Property="Opacity"
          Value=".5" />
  <Setter Property="OverridesDefaultStyle"
          Value="True" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type local:PathButton}">
        <Canvas Width="{TemplateBinding Width}"
                Height="{TemplateBinding Width}"
                Background="Transparent">
          <Path Width="{TemplateBinding Width}"
                Height="{TemplateBinding Width}"
                Data="{Binding ElementName=pathButton,
                                Path=PathData}"
                Fill="#FFFFFFFF"
                Opacity="{TemplateBinding Opacity}"
                Stretch="Uniform" />
        </Canvas>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
  <Style.Triggers>
    <Trigger Property="IsMouseOver"
              Value="True">
      <Setter Property="Opacity"
              Value="1" />
    </Trigger>
    <Trigger Property="IsPressed"
              Value="True">
      <Setter Property="Opacity"
              Value=".75" />
    </Trigger>
  </Style.Triggers>
</Style>

将产生您期望的输出。

更新:

您可以在代码隐藏文件中包含Stylein aResourceDictionary和 Subclass 声明。这将只生成一个 xaml 文件。在此方法中,您不会留下 2 个 xaml 文件。

也将绑定切换为PathData绑定RelativeSource

您可以从此处下载此示例。打开它并检查一下

我还使用了一个插件NestInDependsOn ,它允许您通过编辑 vsproj 文件并添加属性将文件分组到自定义组中。这使您可以将您的ResourceDictionary和代码隐藏类文件分组到一个实体中,PathButton.xaml就像在 IDE 中使用它们的代码隐藏文件一样。UserControlWindow

于 2013-05-04T16:32:52.900 回答