【发布时间】:2021-01-29 09:17:32
【问题描述】:
我有以下(部分)XAML:
<ListView x:Name="logView" Grid.Row="2" ItemsSource="{Binding Logs}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemTemplate>
<DataTemplate>
<FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<FlowDocument FontSize="12" FontFamily="Calibri" PagePadding="0" TextAlignment="Left">
<Paragraph TextIndent="-10" Margin="10,0,0,0">
<Run Text="{Binding .}" />
</Paragraph>
</FlowDocument>
</FlowDocumentScrollViewer>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Logs 是 IEnumerable<string> 绑定到的 ListView(通过 ViewModel,但这在这里不重要)。
如果我删除整个<ListView.ItemTemplate>...</ListView.ItemTemplate>,我就有了我想要的鼠标滚轮滚动行为。但是对于FlowDocumentScrollViewer 及其内容,滚动不再那么流畅了。它仍然会滚动,但只是时不时地,大部分时间会卡住。
为了解决这个问题,我遵循this 解决方案并在代码隐藏中创建了一个 PreviewMouseWheel 处理程序
private void BubbleScrollingToLogView(object sender, MouseWheelEventArgs e)
{
if (!e.Handled)
{
e.Handled = true;
var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
eventArg.RoutedEvent = MouseWheelEvent;
eventArg.Source = sender;
logView.RaiseEvent(eventArg);
}
}
并将其添加到 XAML 中:
....
<FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
PreviewMouseWheel="BubbleScrollingToLogView">
....
但它并没有改变行为。我什至尝试将PreviewMouseWheel="BubbleScrollingToLogView" 添加到<FlowDocument> 和<Paragraph>,假设它们也可能捕获事件。但没有任何帮助。
那么我需要做什么才能获得ListView 的平滑默认滚动行为?
【问题讨论】:
-
出于好奇,您为什么不从 Logs 集合中创建单个 FlowDocument 并在单个 FlowDocumentScrollViewer 中显示?
-
我没想到。感谢您的建议!那么现在,如何将
string集合绑定到FlowDocument以便每个strings 都有自己的段落...? -
向您的视图模型添加一个属性,以创建适当的 FlowDocument。 IIRC FlowDocumentScrollViewer 的 Document 属性可能不可绑定。您可能需要创建一个附加属性来执行分配或其他一些解决方法。
标签: c# wpf listview scroll event-bubbling