C# 开始操作时停止滚动RichTextBlock

C# 开始操作时停止滚动RichTextBlock,c#,mvvm,uwp,C#,Mvvm,Uwp,我有一个聊天,包含在RichTextBlock中 <ScrollViewer Name="ChatScroll" Margin="3" ManipulationMode="All"> <i:Interaction.Behaviors> <helpers:Scro

我有一个聊天,包含在RichTextBlock中

<ScrollViewer Name="ChatScroll"
                              Margin="3"
                              ManipulationMode="All">
                    <i:Interaction.Behaviors>
                        <helpers:ScrollHelper />
                    </i:Interaction.Behaviors>
                    <RichTextBlock>
                        <Paragraph>
                            <InlineUIContainer>
                                <ItemsControl ItemsSource="{Binding SelectedMedia.ChatMessages}"
                                      Margin="0">
                                    //SOME ELSE CODE
                                </ItemsControl>
                            </InlineUIContainer>
                        </Paragraph>
                    </RichTextBlock>
                </ScrollViewer>
因此,当我收到新消息时,我需要在底部滚动,但如果我想查看聊天记录,我不需要向下滚动

我的想法是订阅事件操纵增量并取消向下滚动

public class ScrollHelper : Behavior<ScrollViewer>
{
    private double height = 0.0d;
    private ScrollViewer scrollViewer = null;
    private bool IsBusy = false;

    protected override void OnAttached()
    {
        base.OnAttached();
        //IsBusy = false;
        this.scrollViewer = this.AssociatedObject;
        this.scrollViewer.LayoutUpdated += ScrollViewer_LayoutUpdated;
        this.scrollViewer.ManipulationDelta += ScrollViewer_ManipulationDelta;
    }


    private void ScrollViewer_ManipulationDelta(object sender, Windows.UI.Xaml.Input.ManipulationDeltaRoutedEventArgs e)
    {
        var verticalOffset = scrollViewer.VerticalOffset;
        var maxVerticalOffset = scrollViewer.ScrollableHeight; //sv.ExtentHeight - sv.ViewportHeight;

        if (maxVerticalOffset < 0 ||
            verticalOffset == maxVerticalOffset)
        {
            IsBusy = false;
        }
        else if (e.Delta.Translation.Y < 0 || e.Delta.Translation.Y > 0)
        {
            IsBusy = true;
        }
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        if (this.scrollViewer != null)
        {
            this.scrollViewer.LayoutUpdated -= ScrollViewer_LayoutUpdated;
        }
    }
    private void ScrollViewer_LayoutUpdated(object sender, object e)
    {
        if (!IsBusy)
        {
            if (Math.Abs(this.scrollViewer.ExtentHeight - height) > 1)
            {
                scrollViewer.ChangeView(0, scrollViewer.ExtentHeight, 1);
                this.height = this.scrollViewer.ExtentHeight;
            }
        }
    }
}
但是如果我滚动鼠标滚轮,那么事件就不起作用了?有没有办法订阅滚轮活动?或其他想法如何在查看故事时不向下发送滚动条

有没有办法订阅滚轮活动

鼠标滚轮事件将由滚动条在内部处理,因此我们无法直接订阅此事件,通常,我们可以订阅包含和的事件,我们可以比较FinalView和NextView的垂直偏移来判断向下或向上滚动