双击事件命令并非始终执行

时间:2019-04-15 13:24:18

标签: c# wpf

我对WPF和C#还是很陌生。我正在尝试在用户控件中捕获双击事件,并通过ICommand处理它。

这就是我要这样做的方式:

用户控制:

<UserControl x:Class="MyNamespace.View.MyUserControl"
         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" 
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
         xmlns:local="clr-namespace:MyNamespace.View"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800"
         xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
         DataContext="{Binding MyViewModelClass, Source={StaticResource Locator}}"
         >
<UserControl.Resources>
    <DataTemplate x:Key="MyTemplate">
        <ContentControl>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick">
                    <i:InvokeCommandAction  Command="{Binding DataContext.HandleDoubleClickCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>

            <WrapPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="12" >

                <TextBlock Text="Data: "><Run FontWeight="Light" Text="{Binding data}"/></TextBlock>

        </WrapPanel>
        </ContentControl>
    </DataTemplate>
</UserControl.Resources>

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{DynamicResource ColorPanel2}">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border Grid.Row="0"  BorderThickness="0 0 0 1">
        <WrapPanel Margin="12" VerticalAlignment="Center">
            <TextBlock FontWeight="Bold" Margin="8" VerticalAlignment="Center" FontSize="18"
                       Text="some text: ">
            </TextBlock>
        </WrapPanel>
    </Border>

    <ListView Grid.Row="1" 
              HorizontalAlignment="Stretch" 
              VerticalAlignment="Stretch" 
             ItemsSource="{Binding SelectedItem.listElement, UpdateSourceTrigger=PropertyChanged}"
              ItemTemplate="{StaticResource MyTemplate}"
              SelectedItem="{Binding SelectedItem}"
            />

</Grid>
</UserControl>

然后我将用于处理事件的命令放在ViewModel类中:

ICommand _HandleDoubleClickCommand;
public ICommand HandleDoubleClickCommand
{
    get
    {
        if (_HandleDoubleClickCommand == null)
        {
            _HandleDoubleClickCommand = new RelayCommand<object>(ExecuteHandleDoubleClickCommand, CanExecuteHandleDoubleClickCommand);
        }
        return _HandleDoubleClickCommand;
    }
}

private bool CanExecuteHandleDoubleClickCommand(object arg)
{
    return true;
}

private void ExecuteHandleDoubleClickCommand(object obj)
{
    System.Windows.MessageBox.Show("HandleDoubleClickCommand");
}

所以,基本上,我有一个元素列表,我想处理is上的双击事件。
我看到的行为是,有时执行了HandleDoubleClickCommand,有时却没有执行。我没有看到任何异常,并且我与调试器一起检查了仅在显示消息框时才执行代码。

我还尝试使用 InputBindings 代替 Interaction.Triggers

<ContentControl.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick"
    Command="{Binding DataContext.HandleDoubleClickCommand, RelativeSource={RelativeSource AncestorType=UserControl}, diag:PresentationTraceSources.TraceLevel=High}" />

但是我看到相同的行为。启用 TraceLevel = High 并没有给我有用的信息。 另外,我尝试处理右键单击事件,而不是双击事件,但该命令仅在某些时候执行。

我认为我在这里缺少什么,有人可以帮助我了解问题所在吗?或至少给我一些有关如何调试问题的建议。.
谢谢

更新
我发现,如果我双击元素文本,该命令将始终执行。事实是,即使我双击ListView所选行的空白区域,我也希望执行它。

1 个答案:

答案 0 :(得分:1)

MarginWrapPanel移动到TextBlock并定义一个ItemContainerStyle,使ListViewItem的内容水平延伸。

您还应该设置Background的{​​{1}}属性以捕获点击:

WrapPanel