2011-06-16 75 views
1

我在畫布上有ListBoxItems。我有能力使用ScrollViewer在一些鼠標事件上拖動和滾動畫布上的視圖。這些鼠標事件似乎覆蓋了嵌套在ScrollViewer中的ListBox的SelectionChanged事件,或者因爲鼠標事件捕獲了ListBox之前的點擊,所以決不會做出選擇。如果任何人有任何解決這個問題,將不勝感激。感謝您的時間,這裏是我的代碼。PreviewMouseLeftButtonDown阻止SelectionChanged事件

XAML:

 <ScrollViewer x:Name="objScrollViewer" 
         Grid.Row="0" 
         Grid.Column="1" 
         VerticalScrollBarVisibility="Hidden" 
         HorizontalScrollBarVisibility="Hidden" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" 
         MouseLeftButtonUp ="OnMouseLeftButtonUp" 
         PreviewMouseLeftButtonUp ="OnMouseLeftButtonUp" 
         PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown" 
         PreviewMouseMove="OnPreviewMouseMove" 
         PreviewMouseUp="OnPreviewMouseUp" 
         ScrollChanged="OnScrollViewerScrollChanged"> 

      <ListBox x:Name="objCoreViewer" 
        ItemsSource="{Binding ItemsSource}" 
        Background="Transparent" 
        SelectionChanged="objCoreViewer_SelectionChanged" 
        ItemTemplateSelector="{DynamicResource CoreViewerDataTemplateSelector}" 
        ItemContainerStyleSelector="{DynamicResource ItemContainerStyleSelector}" 
        PreviewMouseWheel="objCoreViewer_PreviewMouseWheel"> 

       <!-- Core Map Canvas --> 

       <ListBox.ItemsPanel> 

        <ItemsPanelTemplate> 
         <local:CoreViewerCanvas x:Name="objCoreViewerCanvas" 
           Background="Transparent" 
           ClipToBounds="True"> 
          <local:CoreViewerCanvas.LayoutTransform> 
           <ScaleTransform ScaleX="{Binding Path=Value, ElementName=ZoomSlider}" 
               ScaleY="{Binding Path=Value, ElementName=ZoomSlider}" /> 
          </local:CoreViewerCanvas.LayoutTransform> 
         </local:CoreViewerCanvas> 
        </ItemsPanelTemplate> 

       </ListBox.ItemsPanel> 

      </ListBox> 

     </ScrollViewer> 

C#:

這不會被調用

private void objCoreViewer_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    } 

這不會得到所謂

private void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var mousePos = e.GetPosition(objScrollViewer); 
     if (mousePos.X <= objScrollViewer.ViewportWidth && mousePos.Y < 
      objScrollViewer.ViewportHeight) 
     { 
      objScrollViewer.Cursor = Cursors.SizeAll; 
      lastDragPoint = mousePos; 
      Mouse.Capture(objScrollViewer); 
     } 
    } 

編輯1:

我改變了的ScrollViewer事件財產的PreviewMouseLeftButtonDown到的MouseLeftButtonDown,現在觸發SelectionChanged事件的方法,但在ScrollViewer中現在不滾動引起MouseLeftButtonDown事件方法永遠不會被捕獲。嘆!

回答

0

改變了鼠標事件方法:

private void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var mousePos = e.GetPosition(objScrollViewer); 
     if (mousePos.X <= objScrollViewer.ViewportWidth && mousePos.Y < 
      objScrollViewer.ViewportHeight) 
     { 
      objScrollViewer.Cursor = Cursors.SizeAll; 
      lastDragPoint = mousePos; 
      Mouse.Capture(objScrollViewer); 
     } 

     FrameworkElement ctrl = (e.OriginalSource as FrameworkElement); 
     if (ctrl != null) 
     { 
      switch (ctrl.DataContext.GetType().ToString()) 
      { 
       case "GE.GNF.ACUMEN.Library.SIMULATOR_BUNDLE_NODAL_DATA": 
        objCoreViewer.SelectedItem = ctrl.DataContext as SIMULATOR_BUNDLE_NODAL_DATA; 
        break; 
       case "GE.GNF.ACUMEN.Library.SIMULATOR_CONTROL_BLADE_NODAL_DATA": 
        objCoreViewer.SelectedItem = ctrl.DataContext as SIMULATOR_CONTROL_BLADE_NODAL_DATA; 
        break; 
       default: 
        break; 
      } 
     } 
    } 
+0

不好判斷你的代碼,但好像'如果(ctrl.DataContext是SIMULATOR_BUNDLE_NODAL_DATA || ctrl.DataContext是SIMULATOR_CONTROL_BLADE_NODAL_DATA)objCoreViewer.SelectedItem = ctrl.DataContext; '會是寫這個更好的方法。 – CodeNaked 2012-01-19 23:13:00