滚动项目控件

jam*_*dgb 1 wpf xaml datagrid scrollviewer wpfdatagrid

我有一个ItemsControl模板,其中包含另一个模板,ItemsControl其模板包含一个DataGrid.

我希望能够滚动第一个ItemsControl,因此我使用了ScrollViewer.

问题是,当鼠标在两个ItemsControl滚动工作中的任何一个上面时,但当鼠标结束时DataGrid它不会.

你知道我怎么解决这个问题吗?

<TabItem Header="Summary">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="5" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ScrollViewer Grid.Row="1"
                      VerticalScrollBarVisibility="Visible">
            <ItemsControl Grid.Row="1"
                          ItemsSource="{Binding CheckResultViewModels}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>
                            <StackPanel Grid.Row="0" Orientation="Horizontal">
                                <TextBlock FontSize="20" FontWeight="ExtraBold">
                                    <Run Text="{Binding CheckResults.Count, Mode=OneWay}" />
                                    <Run>Warnings</Run>
                                </TextBlock>
                            </StackPanel>
                            <ItemsControl Grid.Row="1"
                                          ItemsSource="{Binding CheckResults}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <Border Margin="5">
                                            <DataGrid HorizontalAlignment="Stretch"
                                                      VerticalAlignment="Stretch"
                                                      HorizontalContentAlignment="Stretch"
                                                      VerticalContentAlignment="Stretch"
                                                      AutoGenerateColumns="True"
                                                      AutoGeneratingColumn="DetailsDataGrid_AutoGeneratingColumn"
                                                      CanUserResizeRows="False"
                                                      IsReadOnly="True"
                                                      ItemsSource="{Binding ErrorData}"/>
                                        </Border>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</TabItem>
Run Code Online (Sandbox Code Playgroud)

Roh*_*ats 5

DataGrid在其默认模板中包含ScrollViewer.因此,当鼠标在DataGrid 上时,dataGrid的ScrollViewer会占用滚动事件,因此不会冒泡到父ScrollViewer.

如果您希望外部ScrollViewer滚动,您可以挂钩隧道PreviewMouseWheel事件并手动滚动:

XAML:

<ScrollViewer Grid.Row="1"
              VerticalScrollBarVisibility="Visible"
              PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
    <ItemsControl Grid.Row="1"
                  ItemsSource="{Binding CheckResultViewModels}">
        ...........
Run Code Online (Sandbox Code Playgroud)

代码背后:

private void ScrollViewer_PreviewMouseWheel(object sender, 
                                            MouseWheelEventArgs e)
{
    ScrollViewer scrollViewer = (ScrollViewer)sender;
    scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta);
}
Run Code Online (Sandbox Code Playgroud)