Исключение InvalidOperationException, когда DataGrid теряет фокус на гиперссылке

#c# #silverlight-4.0 #datagrid #hyperlink #richtext

#c# #silverlight-4.0 #datagrid #гиперссылка #richtext

Вопрос:

У меня именно эта проблема в моем приложении Siverlight4:

Описание Возникает ошибка, когда datagrid теряет фокус на гиперссылке (части RichTextBox).

Сведения об исключении:

 {
System.InvalidOperationException: Reference is not a valid visual DependencyObject.
at System.Windows.Media.VisualTreeHelper.GetRelative(DependencyObject reference, RelativeKind relativeKind)
at System.Windows.Media.VisualTreeHelper.GetParent(DependencyObject reference)
at System.Windows.Controls.DataGrid.DataGrid_LostFocus(Object sender, RoutedEventArgs e)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
}
  

Чтобы воспроизвести эту ошибку, поместите DataGrid с некоторыми данными и RichTextBox хотя бы с одной гиперссылкой, в RichTextBox должно быть значение IsReadOnly=»True» , и во время выполнения, сосредоточив внимание на datagrid, щелкните гиперссылку.

Ошибка находится в файле DataGrid.xaml.cs, строка 4782: родительский объект DependencyObject = VisualTreeHelper.getParent(focusedDependencyObject);

От:http://silverlight.codeplex.com/workitem/7696

Похоже, что обходным путем является редактирование библиотек DLL Silverlight, чего я бы предпочел не делать.

РЕДАКТИРОВАТЬ: Похоже, что щелчок в любом месте вызывает это исключение.

Есть другие идеи, как я мог бы обойти эту проблему?

Ответ №1:

Почему RichTextBox должен быть доступен только для чтения? Что произойдет, если она не доступна только для чтения?

Если это известная ошибка в datdgrid, то я бы подумал о взломе решения «если-это-выглядит-правильно-это-правильное» (я думаю, это превосходит модификацию / исправление dll).

Примеры, должна ли это быть гиперссылка? Может ли это быть текстовый блок вместо этого (который вы бы обрабатывали частью гиперссылки в коде)?

Комментарии:

1. Она должна быть доступна только для чтения, поскольку пользователь не должен ее редактировать. RichTextBox должен отображать FlowDocument со всем правильным форматированием. Я не могу ограничить это текстовым полем.

Ответ №2:

Теперь мы придумали обходной путь.

Поскольку мы привязываемся к строке XALM FlowDocument, мы добавили новое свойство в модель для привязки RichtTextBox. В этом свойстве мы вручную удаляем информацию о гиперссылке и заменяем ее тегами, выделенными ЖИРНЫМ шрифтом.

 public string BodyXamlWithOutHyperLink
        {
            get
            {
                const string RegExPattern1 = @"<Hyperlink S*"">";
                const string RegExPattern2 = @"</Hyperlink>";

                string body = this.BodyXaml;

                if (string.IsNullOrEmpty(body))
                {
                    return string.Empty;
                }

                Regex bodyRegEx = new Regex(RegExPattern1);
                body = bodyRegEx.Replace(body, "<Bold>");
                bodylRegEx = new Regex(RegExPattern2);
                body= bodyRegEx.Replace(mail, "</Bold>");

                return body;
            }

            set
            {
               // can be ignored, we are read-only anyway
            }
        }