无法使用滚轮滚动

时间:2013-09-18 12:15:42

标签: c# wpf scrollview

我的滚动查看器有问题。

首先,这是我的代码:

  <GroupBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Header="Pictures"
              Margin="5,2,2,2">
        <ScrollViewer Grid.Column="1" Grid.Row="1" VerticalScrollBarVisibility="Auto" Margin="2">
            <ListView ItemsSource="{Binding ImageBoxes, UpdateSourceTrigger=PropertyChanged}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal" ScrollViewer.CanContentScroll="True"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">
                        <Style.Resources>
                            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/>
                            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
                        </Style.Resources>
                        <Setter Property="BorderBrush" Value="Orange"/>
                        <Setter Property="BorderThickness" Value="1"/>
                        <Setter Property="Margin" Value="2"/>
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Cursor" Value="Hand"/>
                            </Trigger>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="BorderBrush" Value="Blue"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ListView.ItemContainerStyle>
            </ListView>
        </ScrollViewer>
    </GroupBox>

ListView的ItemsSouce绑定到模型中的ObservableCollection。所有项目都正确显示。我只想向上和向下滚动,这很好。

我的问题是,我只能通过用光标向上或向下移动滚动条来滚动。鼠标滚轮不起作用。我需要这个工作。

这是什么问题?

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为ListView已经内置了ScrollViewer。将ListView包裹在冗余ScrollViewer中时,所需的鼠标滚动会丢失。

我看到了两个选项,第一个(最简单的)就是从XAML中删除ScrollViewer

<GroupBox>
    <ListView>
        ...
    </ListView>
</GroupBox>

第二种替代方案看起来比第一种方法更复杂但是解决了垂直鼠标滚轮滚动的问题是覆盖ListView的ControlTemplate并指定不包含ScrollViewer的模板。这样,主XAML中的ScrollViewer就可以了。

类似于答案 here 。这将允许您将滚动查看器保留在模板和XAML之外(不清楚,但是您需要这样做)。下面的XAML缩写为仅显示相关位,您可以通过右键单击Visual Studio设计器中的ListView和编辑模板来看到完整的默认ListView样式(假设您使用的是公平的最新版本的VS):

<Style x:Key="ListViewStyle1" TargetType="{x:Type ListView}">
   ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListView}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="True">

                    <!-- REMOVE THE DEFAULT SCROLLVIEWER HERE BUT KEEP THE ITEMSPRESENTER... -->
                    <!-- <ScrollViewer Focusable="False" Padding="{TemplateBinding Padding}"> -->
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    <!-- </ScrollViewer>-->

                </Border>
                <ControlTemplate.Triggers>
                  ...
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后您的主XAML结构可以保持不变。

<GroupBox>
    <ScrollViewer>
        <ListView Style="{StaticResource ListViewStyle1}" >
           ...
        </ListView>
    </ScrollViewer>
</GroupBox>