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
не может пересылать границы выбора контента, когда нет дочернего контента, что я считаю небольшим упущением. Проблема ОП возникает, когда он прокручивает, но не предполагает, что у него вообще был какой-либо выбор, так что, вероятно, это еще одна проблема с ограничением текста.