ListBox Scrollviewer奇怪的行为

时间:2013-11-18 10:07:01

标签: wpf xaml scrollviewer

我的ListBox的ControlTemplate中有ScrollViewer,我使用的是.Net 4.0 我在CanContentScroll的不同值上面临两个问题。

  1. 当CanContentScroll为True时。

    在这种情况下,当我用鼠标滚动ListBox时,ScrollViewer似乎从视图中随机跳过1或2个项目。但是SelectedItem的选择正常。

  2. 当CanContentScroll为False时。

    在这种情况下,使用鼠标滚动工作正常。但现在SelectedItem的选择不会选择实际的SelectedItem,而是选择它上面或下面的项目。或继续显示以前的SelectedItem。

  3. 请帮帮我。

    <Style TargetType="ListBox" x:Key="ListBoxStyle">
            <Setter Property="ItemContainerStyle" Value="{StaticResource ItemContainerStyle}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBox">
                        <ScrollViewer CanContentScroll="True">
                            <ItemsPresenter/>
                        </ScrollViewer>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    ItemContainerSTyle:

    <Style x:Key="ItemContainerStyle" BasedOn="{StaticResource listBoxItemStyle}" TargetType="ListBoxItem">
            <Setter Property="helper:FluidSelectionAttachedPropertyHelper.IgnoreRightClick" Value="True"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Visibility" Value="Collapsed" />
                </Trigger >
            </Style.Triggers>
        </Style>
    

    的ItemTemplate:

    <Style TargetType="ListBoxItem" x:Key="listBoxItemStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <ContentPresenter Margin="2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

2 个答案:

答案 0 :(得分:2)

您描述的奇怪行为正是您要求使用奇怪的ItemContainerStyle

<Style x:Key="ItemContainerStyle" BasedOn="{StaticResource listBoxItemStyle}" 
    TargetType="ListBoxItem">
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Visibility" Value="Collapsed" />
        </Trigger >
    </Style.Triggers>
</Style>

在此处,您将项目设置为在选中时消失。

对于你的其他滚动问题,我建议你阅读MSDN上的ScrollViewer.CanContentScroll Property页面,因为它看起来在我看来工作正常:

  

ScrollViewer的默认行为是使用物理单位滚动其内容。但是,如果CanContentScroll设置为true,则内容可以使用逻辑单位进行滚动。

应该注意的是,如果项目仅基于string,则很难发现这两个设置之间的差异。

答案 1 :(得分:0)

感谢所有回复。 我找到了改变滚动查看器垂直滚动速度的解决方案,保持CanContentScroll为True。

我将附加属性用于我的滚动查看器列表框模板,并使用以下处理程序方法覆盖其PreviewMouseWheel事件:

static void scrollViewer_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
        {
            var scrollViewer = sender as ScrollViewer;
            if (scrollViewer != null)
            {
                var newOffset = scrollViewer.VerticalOffset;
                if (newOffset < 0 || scrollViewer.ViewportHeight >= scrollViewer.ExtentHeight)
                {
                    newOffset = 0;
                    scrollViewer.ScrollToVerticalOffset(newOffset);
                }
                else if (newOffset + scrollViewer.ViewportHeight >= scrollViewer.ExtentHeight)
                {
                    newOffset = scrollViewer.ExtentHeight - scrollViewer.ViewportHeight;
                    if (e.Delta > 0)
                    {
                        scrollViewer.ScrollToVerticalOffset(newOffset - 1);
                    }
                }
                else
                {
                    if (e.Delta > 0)
                    {
                        scrollViewer.ScrollToVerticalOffset(newOffset - 1);
                    }
                    else
                    {
                        scrollViewer.ScrollToVerticalOffset(newOffset + 1);
                    }

                }
                e.Handled = true;
            }
        }