如何解决从 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">
<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
的平滑默认滚动行为?
解决方法
如果您决定只使用 FlowDocumentScrollViewer
,您可以将 Document
属性绑定到您在视图模型上的属性。
<FlowDocumentScrollViewer Document="{Binding Document}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
</FlowDocumentScrollViewer>
在您的视图模型中定义 Document
类型的 FlowDocument
属性。
private FlowDocument document;
public FlowDocument Document
{
get { return document; }
set
{
document = value;
OnPropertyChanged();
}
}
从 FlowDocument
创建 Logs
:
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);
doc.Blocks.Add(paragraph);
}
Document = doc;
,
禁用 FlowDocumentScrollViewer
以获得默认滚动行为就足够了。由于禁用,我没有注意到外观上的任何差异。
<FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
IsEnabled="False">
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。