2017-10-23 7 views
0

목록 상자 항목에서 단일 및 두 번 클릭 이벤트를 처리하려고합니다. MouseDoubleClick (두 번 클릭하기) 및 PreviewMouseLeftButtonDown (한 번 클릭하기)을 사용했습니다. 이제 응용 프로그램을 실행할 때마다 MouseDoubleClick이 트리거를 가져 오기 때문에 더블 클릭 이벤트가 트리거되지 않습니다. 여기에 내 xaml 코드가 있는데, 나는 두 가지 모두를 처리하기 위해 어떤 이벤트를 사용해야하는지 알고 싶습니다. 어떤 도움을 주셔서 감사합니다. 고맙습니다.목록 상자에서 단일 클릭 이벤트와 더블 클릭 이벤트를 처리하는 방법 WPF 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> 
+0

감사 Hille의,하지만 모든 문제를 포함하지 않은 중복 된 질문을 제안했다. :-) –

답변

2

더블 클릭의 두 번째 클릭은 한 번의 클릭 앞에 정의 항상입니다.

타이머를 사용하여 200ms를 기다리면 첫 번째 다음에 다른 클릭이 있는지 확인할 수 있습니다.

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" ... /> 
+0

안녕하세요 mm8, 답변 해 주셔서 감사합니다. 우리는 두 가지 사건을 구별 할 수있는 그런 사건이 없다고 생각합니다. 이 경우 귀하의 답변을 수락하겠습니다. 그것의 오래된 학교 그러나 그것은 작동 할 것이다. 건배 :-) –

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 ... 
+0

안녕하세요. 귀하의 제안에 감사드립니다. 나는 내 생각에도이 아이디어를 가지고 있었다. 이렇게하면 구식 코드로 파고 들어갈 수 있으므로 이러한 이벤트를 처리 할 수있는 업데이트 된 솔루션을 찾고 있습니다. –

+0

가능한 중복 된 것을 살펴보십시오. 도움을 주실 수 있습니까 :) – Hille

+0

중복 된 제안에 감사드립니다. 그러나 그 모든 문제는 다루지 않습니다. 이 게시물에서 그들은 더블 클릭에 대해 논의했지만 싱글 클릭과 더블 클릭을 구별하는 방법에 대해서는 다루지 않았습니다. –