簡體   English   中英

ListBox Scrollviewer奇怪的行為

[英]ListBox Scrollviewer Weird behavior

我在ListBox的ControlTemplate中有ScrollViewer,我正在使用.Net 4.0我在CanContentScroll的不同值上面臨兩個問題。

  1. 當CanContentScroll為True時。

    在這種情況下,當我用鼠標滾動ListBox時,ScrollViewer似乎從視圖中隨機跳過1或2個項目。 但SelectedItem的選擇正常。

  2. 當CanContentScroll為False時。

    在這種情況下,滾動鼠標工作正常。 但現在SelectedItem的選擇不會選擇實際的SelectedItem,而是選擇它上面或下面的項目。 或繼續顯示以前的SelectedItem。

請幫幫我。

<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>

您描述的奇怪行為正是您要求使用奇怪的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屬性頁面,因為它看起來在我看來工作正常:

ScrollViewer的默認行為是使用物理單位滾動其內容。 但是,如果CanContentScroll設置為true,則內容可以使用邏輯單元進行滾動。

應該注意的是,如果項目僅基於string ,則可能難以發現這兩個設置之間的差異。

感謝所有回復。 我找到了改變滾動查看器垂直滾動速度的解決方案,保持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;
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM