Получение ошибки с методом TextRange по непонятной причине
Я пытаюсь выделить TextRange в richtextbox в wpf, однако я продолжаю получать ошибку ниже о недопустимом аргументе, даже если я совершенно уверен, что аргумент неверен. Я понимаю, как остановить сбой программы, но если выдается это ArgumentException, тогда моя программа не делает то, что я хочу.
Код ниже для метода GetAllWordRanges.
private static IEnumerable<TextRange> GetAllWordRanges(FlowDocument document, List<string> keywords)
{
foreach (string keyword in keywords)
{
TextPointer pointer = document.ContentStart;
while (pointer != null)
{
if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
string textRun = pointer.GetTextInRun(LogicalDirection.Forward);
MatchCollection matches = Regex.Matches(textRun, keyword);
foreach (Match match in matches)
{
int startIndex = match.Index;
int length = match.Length;
TextPointer start = pointer.GetPositionAtOffset(startIndex);
TextPointer end = start.GetPositionAtOffset(length);
yield return new TextRange(start, end);
}
}
pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
}
}
}
Деталь исключения:
System.ArgumentException was unhandled
HResult=-2147024809
Message='SolidBrush' parameter type is not valid for formatting property 'Background'.
Parameter name: value
Source=PresentationFramework
ParamName=value
StackTrace:
at System.Windows.Documents.TextRange.ApplyPropertyValue(DependencyProperty formattingProperty, Object value, Boolean applyToParagraphs, PropertyValueAction propertyValueAction)
at System.Windows.Documents.TextRange.ApplyPropertyValue(DependencyProperty formattingProperty, Object value)
at EmailCheckerWPF.TextAnalyser.turnTextRed(RichTextBox TextBox, List`1 Keywords) in c:\Users\Luke\Documents\Caimbridge comp\EmailCheckerWPF\TextAnalyser.cs:line 138
at EmailCheckerWPF.MainWindow.AnalyseButton_Click(Object sender, RoutedEventArgs e) in c:\Users\Luke\Documents\Caimbridge comp\EmailCheckerWPF\MainWindow.xaml.cs:line 50
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.RaiseEvent(RoutedEventArgs e)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at System.Windows.Controls.Button.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.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.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.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)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at EmailCheckerWPF.App.Main() in c:\Users\Luke\Documents\Caimbridge comp\EmailCheckerWPF\obj\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
1 ответ
В старые добрые времена winforms у нас были типы GDI+, которые использовались для визуализации пользовательского интерфейса.
Затем появился WPF. Это было полное переписывание стека пользовательского интерфейса для настольных приложений. Наряду с созданием различных версий элементов пользовательского интерфейса (System.Windows.Forms.Window и System.Windows.Controls.Window), стек рендеринга и связанные с ним классы также были переписаны. Мудро или нет, многие из предыдущих моделей были воспроизведены в этом переписывании.
Винформные формы останутся в рамках, на которые неразумно наткнуться и причинить себе вред. Поскольку теперь у нас есть две (несовместимые) версии одних и тех же шаблонов, сосуществующих в рамках фреймворка, мы также, к сожалению, можем заманить в ловушку разработчиков уровня WPF.
Одна из самых распространенных ловушек - это импорт System.Drawing
Пространство имен. Эквивалент для разработчиков WPF на самом деле System.Windows.Media
, Оба пространства имен содержат много очень похожих, но несовместимых типов. Если вы не будете осторожны (и если вы не получите хороших сообщений об исключениях, которые сообщают вам действующее пространство имен нужных вам типов в сравнении с пространствами имен типов mothereffign, которые вы фактически используете), вы будете using
неправильное пространство имен и начинайте перебирать кисти GDI+.
Будьте осторожны, разработчики WPF. Убедитесь, что вы всегда используете стек WPF! Винформ для бедных и необразованных. Мы не хотим общаться с такими людьми, не так ли?