2010-05-27 12 views
23

मैं यह जानने का प्रयास कर रहा हूं कि एक स्क्रॉलव्यूअर और एक डाटाग्रिड के साथ एक डब्ल्यूपीएफ विंडो पर माउस स्क्रॉल कैसे काम करना है। WPF और सी # कोडमाउस स्क्रॉल एक डब्ल्यूपीएफ डेटाग्रिड और अतिरिक्त यूआई तत्वों के साथ एक स्क्रॉल व्यूअर में काम नहीं कर रहा है

<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid Grid.Row="0"> 

      <Border Name="DataGridBorder" BorderThickness="2" Margin="1" CornerRadius="4" BorderBrush="#FF080757"> 
       <dg:DataGrid AutoGenerateColumns="False" Name="ValuesDataGrid" 
         BorderThickness="0" CanUserResizeColumns="True" FontWeight="Bold" HorizontalScrollBarVisibility="Auto" 
         CanUserReorderColumns="False" IsReadOnly="True" IsTextSearchEnabled="True" AlternationCount="2" 
         SelectionMode="Extended" GridLinesVisibility="All"     
         HeadersVisibility="Column" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False" 
         RowDetailsVisibilityMode="Collapsed" SelectedIndex="0" 
         RowStyle="{StaticResource CognitiDataGridRowStyle}" 
         > 

        <dg:DataGrid.Columns> 
         <dg:DataGridTemplateColumn Header="Title" > 
          <dg:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <StackPanel Orientation="Horizontal" > 
             <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Path=Name}" FontWeight="Normal" /> 
            </StackPanel> 
           </DataTemplate> 
          </dg:DataGridTemplateColumn.CellTemplate> 
         </dg:DataGridTemplateColumn> 
        </dg:DataGrid.Columns> 
       </dg:DataGrid> 
      </Border> 
     </Grid> 
     <Button Grid.Row="1" Height="90" >hello world</Button> 
    </Grid> 
</ScrollViewer> 

नीचे है और सी # कोड के रूप में इस प्रकार है

public partial class Window1 : Window 
    { 
    public Window1() 
    { 
     InitializeComponent(); 
     initialize(); 
     } 

    public void initialize() 
    { 
     ObservableCollection<MyObject> testList = new ObservableCollection<MyObject>(); 

     for (int i = 0; i < 20; i++) 
     { 
      MyObject my = new MyObject("jack " + i); 
      testList.Add(my); 
     } 

     ValuesDataGrid.ItemsSource = testList; 



    } 
} 

public class MyObject 
{ 
    public string Name { get; set; } 



    public MyObject(string name) 
    { 
     Name = name; 
    } 
    } 

समस्या मैं का सामना करना पड़ रहा है कि जब माउस का उपयोग स्क्रॉल करने के लिए, यह ठीक काम करता है जब यह खत्म हो गया है बटन लेकिन जैसे ही मैं माउस पॉइंटर को ग्रिड पर ले जाता हूं और स्क्रॉल करने का प्रयास करता हूं, कुछ भी नहीं होता है। मैं सीधे स्क्रॉलव्यूवर की स्क्रॉलबार को स्थानांतरित करने में सक्षम हूं। मैं अभी भी एक डब्ल्यूपीएफ नौसिखिया हूं इसलिए डेटाग्रिड पर काम करने के लिए माउस स्क्रॉल कैसे प्राप्त करें इस पर कोई मदद की सराहना की जाएगी। मुझे लगता है कि इसके लिए एक बहुत ही आसान समाधान होना चाहिए, लेकिन मैं इसे

+0

मुझे बिल्कुल वही समस्या है, हालांकि नीचे दिए गए समाधान एमवीवीएम एप्लिकेशन में बहुत अच्छी तरह से काम नहीं करते हैं। हमारे वास्तुकार विचारों में कोई कोड नहीं चाहते हैं, केवल Xaml या व्यवहार। – Kolky

+0

हाय कोलकी, मुझे पता है कि यह जवाब शायद आपके लिए लगभग 6 साल है, लेकिन शायद यह किसी अन्य स्थिति के लिए उपयोगी होगा। आम तौर पर, इस तरह के यूआई प्रकार तर्क एमवीवीएम पैटर्न का उपयोग करके स्वीकार्य है, जैसे क्लास के पीछे कोड का उपयोग करना। यहां एक एमएसडीएन आलेख का एक लिंक दिया गया है: https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx –

उत्तर

11

मुझे लगता है कि डेटाग्रिड को स्क्रॉल करने की आवश्यकता नहीं है - डेटाग्रिड पर वर्टिकलस्क्रॉलबार = "कोई नहीं" सेट करें।

डेटाग्रिड माउस स्क्रॉल ईवेंट निगलता है।

मुझे जो मिला वह कंटेनर स्क्रॉल करने के लिए पूर्वावलोकनमोउसहेल ईवेंट का उपयोग करना है जिसे आप स्क्रॉल करना चाहते हैं। वर्टिकल ऑफ़सेट बदलने के लिए आपको स्क्रॉलव्यूयर का नाम देना होगा।

private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset-e.Delta); 
    } 
51

मुझे लगता है कि डेव का समाधान एक अच्छा है। हालांकि, मैं एक सिफारिश करता हूं जिसे डेटाग्रिड के बजाय स्क्रॉलव्यूवर पर पूर्वावलोकनमाउसहेल ईवेंट पकड़ना है। यदि आप नहीं करते हैं, तो आप डेटाग्रिड या स्क्रॉल बार पर स्क्रॉल कर रहे हैं या नहीं, इस पर आधारित कुछ मामूली मतभेदों को देख सकते हैं। तर्क यह है कि जब स्क्रॉलबार पर माउस घुमाया जाता है तो स्क्रॉलव्यूयर स्क्रॉलिंग को संभालेगा, और डाटाग्रिड घटना डेटाग्रिड पर स्क्रॉलिंग को संभालेगी। उदाहरण के लिए, डेटाग्रिड पर एक माउस व्हील स्क्रॉल आपको अपनी सूची से आगे ला सकता है, फिर स्क्रॉल बार पर होगा। यदि आप स्क्रॉलव्यूवर पूर्वावलोकन ईवेंट पर इसे पकड़ते हैं, तो स्क्रॉल करते समय सभी एक ही माप का उपयोग करेंगे। साथ ही, यदि आप इसे इस तरह पकड़ते हैं, तो आपको स्क्रॉलव्यूज़र तत्व का नाम देने की आवश्यकता नहीं होगी, क्योंकि आपको ऑब्जेक्ट के संदर्भ की आवश्यकता नहीं होगी क्योंकि आप केवल प्रेषक ऑब्जेक्ट को स्क्रॉलव्यूअर पूर्वावलोकनमोउसहेल ईवेंट में पास कर सकते हैं। आखिरकार, मैं घटना के अंत में संभाली गई घटना को चिह्नित करने की अनुशंसा करता हूं, जब तक कि आपको इसे किसी कारण से विरासत के नीचे किसी तत्व में पकड़ने की आवश्यकता न हो। उदाहरण नीचे:

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     ScrollViewer scv = (ScrollViewer)sender; 
     scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta); 
     e.Handled = true; 
    } 
1

मैं डॉन बी के समाधान की कोशिश की और यह बहुत अच्छी तरह से मामलों के लिए एक डेटा ग्रिड पर स्क्रॉल आप अन्य भीतरी स्क्रॉल नियंत्रण की जरूरत नहीं है जब के साथ इस मुद्दे को हल करती है है।

उस स्थिति के लिए जब स्क्रॉल व्यूअर के पास अन्य स्क्रोल करने योग्य नियंत्रण और डेटा ग्रिड के रूप में होता है, तो इसके लिए यह आवश्यक है कि ईवेंट को मुख्य स्क्रॉल व्यूअर के लिए ईवेंट हैंडलर के अंत में संभाला जाना चाहिए ताकि यह हो सके आंतरिक स्क्रोल करने योग्य नियंत्रणों में भी पकड़ लिया जाए, हालांकि इसका दुष्प्रभाव है कि जब स्क्रॉल केवल आंतरिक स्क्रॉल करने योग्य नियंत्रण पर हो, तो यह मुख्य स्क्रॉल व्यूअर पर भी होगा।

तो मैं नवीनीकृत किया है कैसे स्क्रॉल दर्शक पाया जाता है तो यह आवश्यक पुस्तक दर्शक का नाम पता करने के लिए नहीं किया जाएगा के लिए अंतर के साथ डेव समाधान:

private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    ScrollViewer scrollViewer = (((DependencyObject)sender).GetVisualParent<ScrollViewer>()); 
    scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta); 
} 
+0

इससे भी बेहतर होगा, अगर यह इस पर निर्भर नहीं होगा एक तीसरी पार्टी पुस्तकालय। – linac

+1

क्या तीसरी पार्टी लाइब्रेरी है? वे मूल WPF नियंत्रण हैं। –

+0

'GetVisualParent' नहीं है। – linac

0

मैं भी एक WPF हूँ नौसिखिया और ठीक उसी समस्या में फंस गया

i।ई स्क्रॉल करने के लिए माउस का उपयोग करके, यह बटन पर होने पर ठीक काम करता है, लेकिन जैसे ही आप माउस पॉइंटर को ग्रिड पर ले जाते हैं और स्क्रॉल करने का प्रयास करते हैं, कुछ भी नहीं होता है।

लेकिन काम करने के मेरे तरीके के लिए धन्यवाद यानी एक अतिरिक्त मील के लिए जाना और मैंने पाया कि स्क्रॉलव्यूयर को संयोजित नहीं किया जा सकता है यदि यह आपके मामले में समान होता है तो ग्रिड स्क्रॉलव्यूवर टैग के नीचे शुरू होता है और ग्रिड में हमारे पास डेटाग्रिड होता है और डेटाग्रिड में फिर से स्क्रॉलव्यूयर प्रॉपर्टी सेट की गई है। यानी

HorizontalScrollBarVisibility="Auto".`      <Border Grid.Row="3" Name="contentArea" BorderBrush="Black" BorderThickness="1" Margin="10,0,10,10"> 
          <ScrollViewer CanContentScroll="True" IsDeferredScrollingEnabled="False" VerticalScrollBarVisibility="Auto"> 


           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="30"></RowDefinition> 
             <RowDefinition Height="45"></RowDefinition> 
             <RowDefinition Height="100*"></RowDefinition> 
             <RowDefinition Height="105"></RowDefinition>          
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="*"></ColumnDefinition> 
             <ColumnDefinition Width="*"></ColumnDefinition> 

            </Grid.ColumnDefinitions> 


            <Label Grid.Row="0" Grid.Column="0" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" FontWeight="Bold" Content="Vessel: " /> 
            <TextBox Height="30" Width="300" Margin="70,0,0,0" HorizontalAlignment="Left" BorderThickness="1,1,1,1" IsReadOnly="True" Name="txtVessel"/> 

            <Label Grid.Row="0" Grid.Column="2" Margin="0,0,185,0" HorizontalAlignment="Right" VerticalAlignment="Center" FontWeight="Bold" Content="Month:" /> 
            <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="2" Margin="0,0,0,0" HorizontalAlignment="Right" > 
             <ComboBox BorderThickness="2" HorizontalAlignment="Right" Name="CmbMonth" VerticalAlignment="Center" Width="90" /> 
             <ComboBox BorderThickness="2" HorizontalAlignment="Right" Margin="5,0,0,0" Name="CmbYear" VerticalAlignment="Center" Width="90" /> 
            </StackPanel> 
            <Grid Grid.Row="1" Grid.ColumnSpan="2"> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="45"></RowDefinition> 
             </Grid.RowDefinitions> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="30"></ColumnDefinition> 
              <ColumnDefinition Width="220"></ColumnDefinition> 
              <ColumnDefinition Width="80"></ColumnDefinition> 
              <ColumnDefinition Width="80"></ColumnDefinition> 
              <ColumnDefinition Width="80"></ColumnDefinition> 
              <ColumnDefinition Width="80"></ColumnDefinition> 
              <ColumnDefinition Width="120"></ColumnDefinition> 
              <ColumnDefinition Width="120"></ColumnDefinition> 
              <ColumnDefinition Width="140*"></ColumnDefinition> 
             </Grid.ColumnDefinitions> 

             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="0" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="1" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="2" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="3" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="4" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="5" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="6" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="7" ></Border> 
             <Border BorderBrush="Black" BorderThickness="0,1,1,1" Grid.Row="0" Grid.Column="8" ></Border> 
             <Label Grid.Row="0" Grid.Column="1" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content="Item" /> 
             <Label Grid.Row="0" Grid.Column="2" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content="Maker" /> 
             <Label Grid.Row="0" Grid.Column="3" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content="Model" /> 
             <Label Grid.Row="0" Grid.Column="4" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content=" Part No.&#x0a;Serial No." /> 
             <Label Grid.Row="0" Grid.Column="5" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content="Condition" /> 
             <Label Grid.Row="0" Grid.Column="6" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content=" Onboard&#x0a; Calibr/Test" /> 
             <Label Grid.Row="0" Grid.Column="7" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content="  Shore&#x0a; Callibration" /> 
             <Label Grid.Row="0" Grid.Column="8" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Content="Remarks" /> 

            </Grid> 
            <Border Grid.Row="2" Grid.ColumnSpan="2" > 
            <ScrollViewer Grid.Row="2" Grid.ColumnSpan="2" CanContentScroll="True" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Name="ScrollViewer3" Margin="0,0,0,0"> 
             <Grid Name="grdOnBoardCalibrationRecord" Margin="0,0,0,0"> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="30"></ColumnDefinition> 
               <ColumnDefinition Width="220"></ColumnDefinition> 
               <ColumnDefinition Width="80"></ColumnDefinition> 
               <ColumnDefinition Width="80"></ColumnDefinition> 
               <ColumnDefinition Width="80"></ColumnDefinition> 
               <ColumnDefinition Width="80"></ColumnDefinition> 
               <ColumnDefinition Width="120"></ColumnDefinition> 
               <ColumnDefinition Width="120"></ColumnDefinition> 
               <ColumnDefinition Width="140*"></ColumnDefinition> 
              </Grid.ColumnDefinitions> 
              <Border Grid.Column="0" BorderThickness="1,0,1,1" BorderBrush="Black" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="1" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="2" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="3" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="4" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="5" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="6" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="7" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
              <Border Grid.Column="8" BorderThickness="0,1,1,1" Grid.RowSpan="26"></Border> 
             </Grid> 
            </ScrollViewer> 
            </Border> 
            <Grid Grid.Row="3" Grid.ColumnSpan="2"> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="30"></RowDefinition> 
              <RowDefinition Height="30"></RowDefinition> 
              <RowDefinition Height="40"></RowDefinition> 
             </Grid.RowDefinitions> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="*"></ColumnDefinition> 
             </Grid.ColumnDefinitions> 

             <TextBox Grid.Row="0" Grid.Column="0" Height="30" Width="300" TextAlignment="Center" Background="Gray" IsReadOnly="True" Margin="0,0,0,0" HorizontalAlignment="Right" VerticalAlignment="Bottom" BorderThickness="1,1,1,1" Name="txtChiefEngineer"/> 
             <Label Grid.Row="1" Grid.Column="1" Margin="0,0,100,0" HorizontalAlignment="Right" VerticalAlignment="Center" FontWeight="Bold" Content="Chief Engineer" /> 
             <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="0,0,0,0" > 
              <Label Name="lblonshorecomment" Content=" Shore Comment : " HorizontalAlignment="Center" Margin="5,0,0,0" FontWeight="Bold" VerticalAlignment="Center" FontFamily="Calibri" FontStyle="Normal" FontSize="14" ></Label> 
              <TextBox BorderThickness="1" FontWeight="Normal" IsReadOnly="True" Height="44" Width="878" TextWrapping="Wrap" AcceptsReturn="True" HorizontalAlignment="left" Margin="0,0,0,0" Name="txtShoreComment" VerticalAlignment="Center" /> 
             </StackPanel> 

            </Grid> 
           </Grid> 
          </ScrollViewer> 
         </Border>` 
0

आप भी अपने DataGrid पर None को ScrollViewer.PanningMode सेट करना चाहें स्पर्श समर्थन सक्षम और अपने शीर्ष स्तर पर VerticalFirst या अन्य मूल्य के लिए एक ही संपत्ति सेट करने के लिए ScrollViewer

उदाहरण

<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="5" PanningMode="VerticalFirst"> 
    <DataGrid ScrollViewer.PanningMode="None" ItemsSource="{Binding Items}" /> 
</ScrollViewer> 

बेशक, PreviewMouseWheel ईवेंट का भी उपयोग करें जैसा कि मूल मो को ठीक करने के लिए डॉन बी के उत्तरों द्वारा इंगित किया गया है स्क्रॉलिंग समस्या का प्रयोग करें।

private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) 
{ 
    var scrollViewer = (ScrollViewer)sender; 
    scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta); 
    e.Handled = true; 
} 

या, आप बस अपने ScrollViewer

public class TopMouseScrollPriorityBehavior 
{ 
    public static bool GetTopMouseScrollPriority(ScrollViewer obj) 
    { 
     return (bool)obj.GetValue(TopMouseScrollPriorityProperty); 
    } 

    public static void SetTopMouseScrollPriority(ScrollViewer obj, bool value) 
    { 
     obj.SetValue(TopMouseScrollPriorityProperty, value); 
    } 

    public static readonly DependencyProperty TopMouseScrollPriorityProperty = 
     DependencyProperty.RegisterAttached("TopMouseScrollPriority", typeof(bool), typeof(TopMouseScrollPriorityBehavior), new PropertyMetadata(false, OnPropertyChanged)); 

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var scrollViewer = d as ScrollViewer; 
     if (scrollViewer == null) 
      throw new InvalidOperationException($"{nameof(TopMouseScrollPriorityBehavior)}.{nameof(TopMouseScrollPriorityProperty)} can only be applied to controls of type {nameof(ScrollViewer)}"); 
     if (e.NewValue == e.OldValue) 
      return; 
     if ((bool)e.NewValue) 
      scrollViewer.PreviewMouseWheel += ScrollViewer_PreviewMouseWheel; 
     else 
      scrollViewer.PreviewMouseWheel -= ScrollViewer_PreviewMouseWheel; 
    } 

    private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) 
    { 
     var scrollViewer = (ScrollViewer)sender; 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta); 
     e.Handled = true; 
    } 
} 

प्रयोग के लिए निम्न संलग्न संपत्ति सेट कर सकते हैं

<ScrollViewer b:TopMouseScrollPriorityBehavior.TopMouseScrollPriority="True" VerticalScrollBarVisibility="Auto" Margin="5" PanningMode="VerticalFirst"> 
    <DataGrid ScrollViewer.PanningMode="None" ItemsSource="{Binding Items}" /> 
</ScrollViewer> 

कहाँ ख: है नाम स्थान है कि इस व्यवहार होता है

इस तरह आपका कोई सह डी-बैक की आवश्यकता है और आपका ऐप पूरी तरह से एमवीवीएम

संबंधित मुद्दे