在做一个滑动的东西,里面有一些ListBoxItem,每个Item会触发一些事件。每次我滑动的时候如果从没有Item的地方滑到有Item的地方,或者从Item里面往外滑动时,都会触发到Item里面的事件。本来Item是用SelectionChanged的这个事件的。但对于我这种菜鸟来说表示消化不了。所以我把这些事件放到了PreviewMouseUp中,然后先在PreviewMouseDown中抓住鼠标的坐标,然后再在Up中计算出其中的坐标的差,然后在一定的范围内就代表这这个东西没有滑动而是正常的点击,而如果移动了一定的距离则表明我是在滑动,然后就可以不触发其中的事件。
下面我做了一个小的DEMO,当我鼠标移动的时候右边的TextBox是不会显示出Item中的项的,然后只有当我点击的时候才会触发此项,然后把Item中的String放入TextBox中。
主要代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void listBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Point p = e.GetPosition(listBox); x = p.X; y = p.Y; } private void listBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { Point p = e.GetPosition(listBox); var offsetX = Math.Abs(p.X - x); var offsetY = Math.Abs(p.Y - y); if (offsetX <= 10 && offsetY <= 10 && listBox.SelectedItem != null) { dosomething(); } } void dosomething() { if (listBox.SelectedItem != null) { foreach (ListBoxItem list in listBox.SelectedItems) { if (list != null) { string str = list.Content.ToString(); tb.Text = str; } } } } private double x; private double y; }