我的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>
答案 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;
}
}