【问题标题】:How Can I Handle Single and Double Click Events On a Listbox WPF XAML [duplicate]如何处理列表框 WPF XAML 上的单击和双击事件 [重复]
【发布时间】:2017-10-23 11:18:23
【问题描述】:

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

编辑:我的代码无法触发双击,因为它触发了两次单击事件。

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

【问题讨论】:

  • 感谢 Hille,但建议的重复问题并未涵盖整个问题。 :-)

标签: c# wpf xaml mvvm listbox


【解决方案1】:

双击的第二次单击定义为总是在单击之前。

您可以使用计时器等待大约 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" ... />

【讨论】:

  • 您好 mm8,谢谢您的回答。我认为我们没有此类事件可用于区分两个事件。在这种情况下,我会接受你的回答。它的老学校,但它会工作。干杯:-)
【解决方案2】:

我找不到好的解决方案,但是您可以通过计算一段时间内的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 ...

【讨论】:

  • 嗨希勒。谢谢你的建议。我心里也有这个想法。这将让我们深入研究旧式代码,因此,我正在寻找可用的更新解决方案来处理这些事件。
  • 看看我标记的可能重复的,它可以帮助你:)
  • 感谢您的重复建议,但这并不能涵盖整个问题。在那篇文章中,他们讨论了双击,但没有说明如何区分单击和双击。
  • 我在 inet 上也找不到东西。因此,如果您找到解决方案,请告诉我们
  • 感谢您的帮助,如果找到解决方案,我会通知您。干杯:-)
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 2010-12-17
  • 1970-01-01
  • 2014-05-17
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多