1

Buttonによって定義されたカスタムの外観を持つ がありControlTemplateます。

を含む が含まれてCanvasいますPathPath.Opacityマウスの状態に応じて変更を追加したいと思います。

  • デフォルト - 0.5
  • マウスオーバー、押されていない - 1.0
  • マウスオーバー、プレス - 0.5

最初のケースは、 のローカル値を設定し、 に 1 を追加するだけでカバーPath.Opacityされ0.5ます。TriggerIsMouseOver

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

ただし、3 番目のケースは機能しません。次のトリガーを追加しました。

<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.Opacityれた場合に設定する必要があります。0.75

不透明度が!0.5ではなく に変更されるため、これにこだわっています。0.75トリガーは適用されているようですが、期待どおりに機能しません...

4

1 に答える 1

1

の を使用せず、のに直接トリガーを使用するOpacityのはなぜですか。とにかく、これ以外に何もありません。ButtonButtonStyleControlTemplatePath

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

期待する出力が生成されます。

アップデート:

StyleをaResourceDictionaryに入れ、コード ビハインド ファイルに Subclass 宣言を入れることができます。これにより、xaml ファイルが 1 つだけ生成されます。この方法では、xaml ファイルが 2 つ残されることはありません。

PathDataまた、バインディングをバインディングに切り替えましたRelativeSource

このサンプルは、ここからダウンロードできます。開いて確認してみてください

また、vsproj ファイルを編集して属性を追加することで、ファイルをカスタム グループにグループ化できるアドイン NestInも使用しましたDependsOn。これによりResourceDictionary、コード ビハインド クラス ファイルとコード ビハインド クラス ファイルを 1 つのエンティティにグループ化し、コード ビハインド ファイルを使用して IDE を表示できますPathButton.xamlUserControlWindow

于 2013-05-04T16:32:52.900 に答える