FlowDocumentScrollViewer аварийно завершает работу при прокрутке

Я работаю над приложением wpf, у которого есть FlowDocument, связанный с FlowDocumentScrollViewer. При прокрутке FlowDocumentScrollViewer я получаю исключение InvalidOperationException: "Этот TextNavigator" не имеет текстового элемента области видимости. и это приводит к сбою приложения.

Детали исключения:

System.InvalidOperationException: 'This TextNavigator' has no scoping text element.
at System.Windows.Documents.TextPointer.MoveToElementEdge(ElementEdge edge)
at System.Windows.Documents.TextPointer.System.Windows.Documents.ITextPointer.MoveToElementEdge(ElementEdge edge)
at System.Windows.Documents.TextPointerBase.GetFollowingNonMergeableInlineContentStart(ITextPointer position)
at System.Windows.Documents.TextSelection.get_PropertyPosition()
at System.Windows.Documents.TextSelection.GetCurrentValue(DependencyProperty formattingProperty)
at System.Windows.Documents.TextSelection.GetCaretBrush(TextEditor textEditor)
at System.Windows.Documents.TextSelection.UpdateCaretStateWorker(Object o)
at System.Windows.Documents.TextSelection.UpdateCaretState(CaretScrollMethod caretScrollMethod)
at System.Windows.Documents.TextSelection.System.Windows.Documents.ITextRange.NotifyChanged(Boolean disableScroll, Boolean skipEvents)
at System.Windows.Documents.TextRangeBase.EndChange(ITextRange thisRange, Boolean disableScroll, Boolean skipEvents)
at System.Windows.Documents.TextRange.System.Windows.Documents.ITextRange.EndChange(Boolean disableScroll, Boolean skipEvents)
at System.Windows.Documents.TextRange.ChangeBlock.System.IDisposable.Dispose()
at System.Windows.Documents.TextEditorMouse.OnMouseMoveWithFocus(TextEditor This, MouseEventArgs e)
at System.Windows.Documents.TextEditorMouse.OnMouseMove(Object sender, MouseEventArgs e)
at System.Windows.Input.MouseEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 

Я не получаю никаких исключений при создании FlowDocument. Я искал в Интернете, но не нашел информации, которая может помочь.

1 ответ

У меня нет прямого объяснения, но сегодня я столкнулся с тем же исключением. И в моем случае ответ таков: не выбирайте пустой вместе с любым «более подходящим» компонентом, который у вас есть.

Это мой xaml, это пользовательский элемент управления, я создаю экземпляр и помещаю его в свое окно (он должен быть похож на «домашнюю страницу» внутри первого TabItemиз TabControlоткуда я решаю, что делать в моем приложении "швейцарский нож"). Обратите внимание (чтобы использовать его для размещения пользовательского интерфейса, похожего на заметку, для вставки любого текста и сохранения его в файле дампа), я прокомментировал его содержимое:

          <DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        
        <FlowDocumentScrollViewer 
            IsToolBarVisible="False" Zoom="60" 
            HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <FlowDocument>
                <Paragraph><Run FontSize="24">Quick start :</Run></Paragraph>
                <List MarkerOffset="16" LineHeight="16">
                    <ListItem><Paragraph>Open application directory in <Hyperlink NavigateUri="" RequestNavigate="ExploreAppDir_RequestNavigate">Explorer</Hyperlink>...</Paragraph></ListItem>
                    <ListItem><Paragraph>Manage <Hyperlink NavigateUri="" RequestNavigate="GalleryManager_RequestNavigate">images gallery</Hyperlink>...</Paragraph></ListItem>
                    <ListItem><Paragraph>Create a model...</Paragraph></ListItem>
                    <ListItem><Paragraph>Launch server...</Paragraph></ListItem>
                </List>
                
                <BlockUIContainer>
                    <!--DockPanel Height="100">
                        <TextBox DockPanel.Dock="Top" />
                        <Grid />
                    </DockPanel-->
                </BlockUIContainer>
                
                <Paragraph>
                    <Bold>What to do next ?</Bold>
                </Paragraph>
            </FlowDocument>
        </FlowDocumentScrollViewer>
        
    </DockPanel>

Я закомментировал содержимое файла , и когда я начинаю выбирать от текста «Что делать дальше» до компонента, я получаю исключение.

Когда я раскомментирую содержимое, т. е. теперь у меня есть это текстовое поле и сетка-заполнитель, я могу выбрать что угодно (любое из FlowDocumentэлементы), пройти через компонент (включая его текстовое поле) и дальше, без исключения.

Я вообще не понимаю исключения. Судя по словам в стеке вызовов, он кажется пустым. BlockUIContainerне может пересылать границы выбора контента, когда нет дочернего контента, что я считаю небольшим упущением. Проблема ОП возникает, когда он прокручивает, но не предполагает, что у него вообще был какой-либо выбор, так что, вероятно, это еще одна проблема с ограничением текста.

Другие вопросы по тегам