[英]ListBox Scrollviewer Weird behavior
我在ListBox的ControlTemplate中有ScrollViewer,我正在使用.Net 4.0我在CanContentScroll的不同值上面臨兩個問題。
當CanContentScroll為True時。
在這種情況下,當我用鼠標滾動ListBox時,ScrollViewer似乎從視圖中隨機跳過1或2個項目。 但SelectedItem的選擇正常。
當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.