气泡滚动事件从FlowDocumentScrollViewer到ListView



我有以下(部分)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>

LogsListView绑定的IEnumerable<string>(通过ViewModel,但这在这里不重要)。

如果我删除整个<ListView.ItemTemplate>...</ListView.ItemTemplate>,我有我想要的鼠标滚轮滚动行为。但是对于FlowDocumentScrollViewer和它的内容,滚动不再像以前那样顺畅了。它仍然可以滚动,但只是偶尔,大多数时候它会卡住。

试图解决这个问题,我遵循这个解决方案,并在

后面的代码中创建了一个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的平滑,默认滚动行为呢?

如果您决定只使用FlowDocumentScrollViewer,您可以将Document属性绑定到视图模型上的属性。

<FlowDocumentScrollViewer Document="{Binding Document}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
</FlowDocumentScrollViewer>

在视图模型中定义FlowDocument类型的Document属性。

private FlowDocument document;
public FlowDocument Document
{
get { return document; }
set
{
document = value;
OnPropertyChanged();
}
}

CreateFlowDocumentfromLogs:

var doc = new FlowDocument();
doc.FontSize = 12;
doc.FontFamily = new FontFamily("Calibri");
doc.PagePadding = new Thickness(0);
doc.TextAlignment = TextAlignment.Left;
foreach (var log in Logs)
{
var paragraph = new Paragraph(new Run(log));
paragraph.TextIndent = -10;
paragraph.Margin = new Thickness(10, 0, 0, 0);
doc.Blocks.Add(paragraph);
}
Document = doc;

这足以禁用FlowDocumentScrollViewer来获得默认的滚动行为。由于禁用,我没有注意到外观有任何变化。

<FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
IsEnabled="False">

最新更新