InvalidOperationException, когда DataGrid теряет фокус на гиперссылку - PullRequest
2 голосов
/ 06 мая 2011

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

Описание Существует ошибка, когда сетка данных теряет фокус на гиперссылку (часть 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.xaml.cs, строка 4782: DependencyObject parent = VisualTreeHelper.GetParent (focusDependencyObject);

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

Обходным решением является редактирование DLL-файлов Silverlight, что я бы предпочел не делать.

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

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2011

Мы нашли обходной путь сейчас.

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

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
            }
        }
0 голосов
/ 07 мая 2011

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

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

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

...