【问题标题】:bubble scroll event from FlowDocumentScrollViewer to ListView从 FlowDocumentScrollViewer 到 ListView 的气泡滚动事件
【发布时间】: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>

LogsIEnumerable&lt;string&gt; 绑定到的 ListView(通过 ViewModel,但这在这里不重要)。

如果我删除整个&lt;ListView.ItemTemplate&gt;...&lt;/ListView.ItemTemplate&gt;,我就有了我想要的鼠标滚轮滚动行为。但是对于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" 添加到&lt;FlowDocument&gt;&lt;Paragraph&gt;,假设它们也可能捕获事件。但没有任何帮助。

那么我需要做什么才能获得ListView 的平滑默认滚动行为?

【问题讨论】:

  • 出于好奇,您为什么不从 Logs 集合中创建单个 FlowDocument 并在单个 FlowDocumentScrollViewer 中显示?
  • 我没想到。感谢您的建议!那么现在,如何将string 集合绑定到FlowDocument 以便每个strings 都有自己的段落...?
  • 向您的视图模型添加一个属性,以创建适当的 FlowDocument。 IIRC FlowDocumentScrollViewer 的 Document 属性可能不可绑定。您可能需要创建一个附加属性来执行分配或其他一些解决方法。

标签: c# wpf listview scroll event-bubbling


【解决方案1】:

如果您决定只使用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();
    }
}

Logs 创建FlowDocument

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;

【讨论】:

    【解决方案2】:

    禁用FlowDocumentScrollViewer 以获得默认滚动行为就足够了。由于禁用,我没有注意到外观有任何差异。

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

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多