当鼠标悬停在内容上时,用于ItemsControl / DataTemplate的WPF ScrollViewer不会随滚轮滚动

问题描述

我有一个相当复杂的WPF页面,该页面填充了层次结构形式(包含问题的部分,这些问题可能是下拉菜单,复选框等)。不同的问题类型由ContentControlContentTemplateSelector处理。

下面的代码按预期设置了页面,并为我提供了一个不错的滚动条,但是不幸的是,如果在光标位于内容上方的情况下尝试使用滚轮,则不会滚动;仅当光标位于各部分之间/两侧时滚动。

似乎我需要确保轮事件被冒起,以便ScrollViewer可以处理它们,但是我不确定如何实现,即可以在xaml内完成还是需要被隐藏在代码后面?

任何帮助将不胜感激。

我认为这可能是xaml中最有用的部分(出于可读性考虑,请询问是否需要查看任何详细信息):

    <Grid>
    <DockPanel Background="{DynamicResource BackgroundColour}">
        <!-- BackgroundColour is defined at runtime in Dictionary.xaml.cs -->
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
            </Grid.RowDefinitions>
            <StackPanel Grid.Row="0" HorizontalAlignment="Stretch" Height="80" VerticalAlignment="Top">...</StackPanel>
            <DockPanel Grid.Row="1">
                <TextBlock DockPanel.Dock="Top" FontWeight="Bold" FontSize="18" FontFamily="Verdana" Padding="20,12,8" Text="{Binding FormTemplateViewModel.Name}"></TextBlock>
                <ScrollViewer DockPanel.Dock="Top"  VerticalScrollBarVisibility="Auto" >
                    <ItemsControl ItemsSource="{Binding Path=FormTemplateViewModel.ObservableSectionsShowing}" BorderThickness="0">
                            <DataTemplate>
                                <Border Visibility="{Binding Path=IsShowing,Converter={StaticResource booleanToVisibilityConverter}}" BorderBrush="{DynamicResource FormBorderColour}" CornerRadius="12,12" BorderThickness="2,2,2" Margin="15,15,0" Height="Auto">
                                    <!-- FormBorderColour and BackgroundColour are defined in Dictionary.xaml.cs -->
                                    <DockPanel>
                                        <TextBlock DockPanel.Dock="Top" Style="{StaticResource collapsibleTextBlock}" FontWeight="Bold" FontSize="18" FontFamily="Verdana" Padding="8,4,0" Text="{Binding Name}"></TextBlock>
                                        <TextBlock DockPanel.Dock="Top" Style="{StaticResource collapsibleTextBlock}" Padding="8,0" Text="{Binding Path=PreText}" TextWrapping="Wrap"></TextBlock>
                                        <DataGrid DockPanel.Dock="Top" Background="{DynamicResource BackgroundColour}" CanUserAddRows="False"  ItemsSource="{Binding Path=ObservableItemsShowing}" AutoGenerateColumns="False" HeadersVisibility="None" GridLinesVisibility="None" BorderThickness="0" BorderBrush="Transparent" Margin="8,8,8" Padding="8,0" Style="{StaticResource DataGridBase}">
                                            <DataGrid.Columns>
                                                <!-- Example of how to put a mandatory * as the first column -->
                                                <!--<DataGridTemplateColumn IsReadOnly="True" Header="Required" Width="SizeToCells" CellStyle="{StaticResource baseDataGridCell}">
                                                    <DataGridTemplateColumn.CellTemplate>
                                                        <DataTemplate>
                                                            <Label Visibility="{Binding Path=Required,Converter={StaticResource booleanToVisibilityConverter}}">
                                                                <TextBlock Foreground="Orange" TextWrapping="Wrap" Text="*"  />
                                                            </Label>
                                                        </DataTemplate>
                                                    </DataGridTemplateColumn.CellTemplate>
                                                </DataGridTemplateColumn>-->
                                                <DataGridTemplateColumn IsReadOnly="True" Header="Name" Width="1*" CellStyle="{StaticResource baseDataGridCell}">
                                                    <DataGridTemplateColumn.CellTemplate>
                                                        <DataTemplate>
                                                            <Label>
                                                                <TextBlock TextWrapping="Wrap" Text="{Binding Path=FirstObservationType.Name}"  />
                                                            </Label>
                                                        </DataTemplate>
                                                    </DataGridTemplateColumn.CellTemplate>
                                                </DataGridTemplateColumn>
                                                <DataGridTemplateColumn Header="PrevValue" IsReadOnly="True" Width="1*" CellStyle="{StaticResource rightAlignDataGridCell}">
                                                    <DataGridTemplateColumn.CellTemplate>
                                                        <DataTemplate>
                                                            <Label>...</Label>
                                                        </DataTemplate>
                                                    </DataGridTemplateColumn.CellTemplate>
                                                </DataGridTemplateColumn>
                                                <DataGridTemplateColumn Header="Answer" Width="3*" CellStyle="{StaticResource rightAlignDataGridCell}">
                                                    <DataGridTemplateColumn.CellTemplate>
                                                        <DataTemplate>
                                                            <ContentControl Name="ccOptionSelector" Content="{Binding}" ContentTemplateSelector="{DynamicResource MyTemplateSelector}"></ContentControl>
                                                        </DataTemplate>
                                                    </DataGridTemplateColumn.CellTemplate>
                                                </DataGridTemplateColumn>
                                                <DataGridTemplateColumn IsReadOnly="True" Header="Unit" Width="Auto" CellStyle="{StaticResource baseDataGridCell}">
                                                    <DataGridTemplateColumn.CellTemplate>
                                                        <DataTemplate>
                                                            <Label>
                                                                <TextBlock TextWrapping="Wrap" Text="{Binding Path=FirstObservationType.UnitText}"  />
                                                            </Label>
                                                        </DataTemplate>
                                                    </DataGridTemplateColumn.CellTemplate>
                                                </DataGridTemplateColumn>
                                            </DataGrid.Columns>
                                        </DataGrid>
                                        <TextBlock DockPanel.Dock="Top" Style="{StaticResource collapsibleTextBlock}" Padding="8" Text="{Binding Path=PostText}" TextWrapping="Wrap"></TextBlock>
                                    </DockPanel>
                                </Border>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </ScrollViewer>
            </DockPanel>
            <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10">...</StackPanel>
        </Grid>
    </DockPanel>
</Grid>

典型的DataTemplate如下所示,在ResourceDictionary中定义(与上述相同的xaml文件中):

            <DataTemplate x:Key="checkboxOptionDataTemplate" DataType="{x:Type bm:ObservationTypeViewModel}">
            <CheckBox IsEnabled="{Binding Path=FirstObservationType.IsEnabled}" IsChecked="{Binding Path=FirstObservationType.CheckboxValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                <CheckBox.Resources>
                    <local:BindingProxy x:Key="proxy" Data="{Binding FirstObservationType}" />
                </CheckBox.Resources>
            </CheckBox>
        </DataTemplate>

我尝试使用以下方法,但没有用:

                        <!--<ItemsControl.Template>
                            <ControlTemplate TargetType="{x:Type ItemsControl}">
                                <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                                    <ItemsPresenter></ItemsPresenter>
                                </ScrollViewer>
                            </ControlTemplate>
                        </ItemsControl.Template>-->
                        <!--For padding between sections-->
                        <ItemsControl.ItemContainerStyle>
                            <Style>
                                <Setter Property="FrameworkElement.Margin" Value="2,2"/>
                            </Style>
                        </ItemsControl.ItemContainerStyle>
                        <ItemsControl.ItemTemplate>

使用这种代码在后面的代码中选择了正确的数据模板:

        public override DataTemplate SelectTemplate(object sender,DependencyObject container)
    {
        if (!(container is FrameworkElement elem)) return null;

        var formItem = elem.BindingGroup.Items.Cast<FormItemViewModel>().FirstOrDefault();
        if (formItem == null || formItem.ObservableObsTypes == null || formItem.ObservableObsTypes.Count() == 0) return elem.FindResource("defaultOptionDataTemplate") as DataTemplate;

        if (!(formItem.ObservableObsTypes.FirstOrDefault() is ObservationTypeViewModel item))
        {
            throw new ApplicationException();
        }

        switch (item.Type)
        {
            ...
            case "checkbox": return elem.FindResource("checkboxOptionDataTemplate") as DataTemplate;
            ...
            default: return elem.FindResource("defaultOptionDataTemplate") as DataTemplate;
        }
    }

谢谢卢克

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...