WPF:鼠标双击图像使用交互

时间:2017-02-22 15:58:51

标签: wpf double-click

我正在尝试使用交互功能来实现鼠标双击标准图像控件。 Image控件在UserControl上,应该处理鼠标双击的方法是在视图模型上。代码如下:

1)UserControl:

<ItemsControl Grid.Row="0" ItemsSource="{Binding SelectedEventPhotoList}"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"                  
            Name="SelectedListView">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" Columns="3"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}" Stretch="None">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseDoubleClick">
                        <ei:CallMethodAction MethodName="DblClick" TargetObject="{Binding}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Image>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

3)查看模型:

public void DblClick()
{
    MessageBox.Show("Double click!");
}

但是,它不起作用。

更新:

我这样做了,但它不起作用:

1)XAML:

<ItemsControl Grid.Row="0" ItemsSource="{Binding SelectedEventPhotoList}"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"                  
            Name="SelectedListView">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" Columns="3"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <Image Source="{Binding}">
                    <Image.InputBindings>
                        <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding MouseDoubleClickCommand}"/>
                    </Image.InputBindings>
                </Image>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

2)查看模型:

public DelegateCommand MouseDoubleClickCommand { get; private set; }

在构造函数中:

MouseDoubleClickCommand = new DelegateCommand(DblClick);

并添加方法:

public void DblClick()
{
    MessageBox.Show("Double click!");
}

2 个答案:

答案 0 :(得分:3)

Image类没有MouseDoubleClick个事件,但您可以使用绑定到InputBinding属性的ICommand

<Image Source="pic.png">
    <Image.InputBindings>
        <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding MouseDoubleClickCommand}"/>
    </Image.InputBindings>
</Image>
public ICommand MouseDoubleClickCommand { get; } = new DelegateCommand<object>(obj => { MessageBox.Show(""); });

您需要提供ICommand界面的实现或使用其他人的界面。 Prism中提供DelegateCommand<T>课程:https://www.nuget.org/packages/Prism.Wpf/

有关命令以及如何使用MVVM设计模式处理事件的更多信息,请参阅以下博文:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/

修改

如果在视图模型中定义了命令,即DataContext本身的ItemsControl,则应使用RelativeSource来绑定它:

<DataTemplate>
    <Image Source="{Binding}">
        <Image.InputBindings>
            <MouseBinding MouseAction="LeftDoubleClick"
                          Command="{Binding DataContext.MouseDoubleClickCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"/>
        </Image.InputBindings>
    </Image>
</DataTemplate>

答案 1 :(得分:2)

有时,处理OnMouseDownClickCount(或MouseLeftButtonDown)事件处理程序并检查ClickCount参数的MouseButtonEventArgs属性很有用。这种方法可以处理单击,双击,三次单击等:)

private void OnMouseDownClickCount(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
    {
        // Double Click occurred.
        ...
    }
}

但是这种方法有一个“功能”。双击OnMouseDownClickCount时,事件会发生两次:第一次与e.ClickCount == 1,然后与e.ClickCount == 2