如何在列表框WPF XAML上处理单击和双击事件

时间:2017-10-23 11:18:23

标签: c# wpf xaml mvvm listbox

我正在尝试处理列表框项目上的单击和双击事件。我用MouseDoubleClick(听双击)和PreviewMouseLeftButtonDown(听单击)。现在,当我运行应用程序时,双击事件不会触发,因为每次MouseDoubleClick都会触发。这是我的xaml代码,我想知道我应该用什么事件来处理两者,感谢任何帮助。谢谢。

修改:我的代码无法触发双击,因为它会触发单击事件2次。

<ListBox Grid.Column="1"  ItemsSource="{Binding Items}" Name="detailList" 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         MouseDoubleClick="detailList_MouseDoubleClick"
         PreviewMouseLeftButtonDown="DetailList_OnPreviewMouseLeftButtonDown"
         >
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"></WrapPanel>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate >
        <DataTemplate>
            <StackPanel Orientation="Vertical" Width="90" >
                <Image Width="80" Source="{Binding Image}"/>
                <TextBlock  Width="60" Height="30" TextWrapping="Wrap" FontSize="11" Text="{Binding Name}" TextAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

2 个答案:

答案 0 :(得分:2)

双击的第二次点击是按照定义始终,然后单击一下。

您可以使用计时器等待200毫秒来查看第一个点击后是否还有其他点击。

public partial class MainWindow : Window
{
    System.Windows.Threading.DispatcherTimer _timer = new System.Windows.Threading.DispatcherTimer();
    public MainWindow()
    {
        InitializeComponent();
        _timer.Interval = TimeSpan.FromSeconds(0.2); //wait for the other click for 200ms
        _timer.Tick += _timer_Tick;
    }

    private void lv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if(e.ClickCount == 2)
        {
            _timer.Stop();
            System.Diagnostics.Debug.WriteLine("double click"); //handle the double click event here...
        }
        else
        {
            _timer.Start();
        }
    }

    private void _timer_Tick(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("click"); //handle the Click event here...
        _timer.Stop();
    }
}
<ListBox PreviewMouseLeftButtonDown="lv_PreviewMouseLeftButtonDown" ... />

答案 1 :(得分:1)

我无法找到一个好的解决方案,但您可以在一段时间内计算PreviewMouseLeftButtonDown来解决问题。

If the mouse was clicked only one time in 0.3 sec, do ...

If the mouse was clicket two times in 0.3 sec, do ...