#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
}
}