違い - wpf ユーザー コントロール イベント 親




ClickイベントによるWPFイメージコントロール (3)

マウスクリックに応答するWPFアプリケーションで<Image>を使用したいと考えています。 ボックス内には「マウスアップ」と「ムーダウン」のイベントのみが用意されています。 私はこれをかなり特定しています。 コントロールを拡張する方法や、別のコントロールを使用して同じ効果を与える方法はありますか?


  1. OnMouseLeave - isClickedもfalseに設定されます。 それ以外の場合は、マウスをクリックしてマウスを離します。 その後、マウスをクリックしてマウスを離して、クリックが行われるようにします。

4つのハンドラと2つのブール変数のセットを使用できます。

ブーリアン:

  1. IsClicked
  2. IsEntered

ハンドラ:

  1. OnMouseDown - IsClickedをtrueに設定します。
  2. OnMouseEnter - IsEnteredをtrueに設定します。
  3. OnMouseLeave - IsEnteredをfalseに設定します。
  4. OnMouseUp - if(IsClicked && IsEntered){/ TODO your logic /}そしてIsClickedをfalseに設定します。

この構造は、従来のクリックの機能を実装します。


Shawn Mcleanの答えを拡張するために、WPFの優れた機能の1つは、コントロールの外観を完全に変更しながらコントロールの動作を活用する機能です。 ボタンのような振る舞いをするイメージ(ボタンイベント、コマンドバインディング、デフォルトのボタン割り当てなど)を作成する場合は、ボタンコントロールにイメージを配置し、そのボタンを再作成してボタン「クロム」を削除します。 これは、あなたが望む外観のボタンの素敵なAPIを提供します。 このスタイルを再利用することができます。この方法を使用すると、新しい画像ボタンにバインドするコマンドがある場合、コードの中にイベントハンドラを作成する必要性が減ります。

このようなスタイルを作成するのは簡単です。 リソース内に名前付きキーを持つ新しいスタイルリソースを作成し、このリソースをボタンのStyleプロパティに割り当てます。 ここに私が一緒に投げた例があります:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ButtonStyleTestApp.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<Window.Resources>
    <Style x:Key="NoChromeButton" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="Chrome" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                    <ControlTemplate.Triggers>                          
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="#ADADAD"/>
                            <Setter Property="Opacity" TargetName="Chrome" Value="0.5"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot" Background="#FF44494D">
    <Button Style="{DynamicResource NoChromeButton}" Click="ButtonClicked" >
        <Image Source="Desert.png" Stretch="None"/>
    </Button>
</Grid>
</Window>




xaml