我在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(focusedDependencyObject);
来自:http://silverlight.codeplex.com/workitem/7696
解决方法似乎是编辑Silverlight DLL,我宁愿不这样做。
编辑:看起来点击任意位置会抛出此异常。
我可以解决这个问题吗?
答案 0 :(得分:0)
为什么RichTextBox必须只读?如果不是只读会发生什么?
如果这是datdgrid中的一个已知错误,那么我会考虑攻击一个if-it-look-right-right-right-right解决方案(我认为这比修改/修复一个dll要好)。
示例,是否必须是超链接?它可以是一个文本块(您可以在代码中处理超链接部分)吗?
答案 1 :(得分:0)
我们现在已经提出了解决方法。
当我们绑定到FlowDocument的XALM字符串时,我们向Model添加了一个新属性以供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
}
}