DataGrid将焦点丢失到HyperLink时出现InvalidOperationException

时间:2011-05-06 07:35:17

标签: c# silverlight-4.0 datagrid hyperlink richtext

我在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,我宁愿不这样做。

编辑:看起来点击任意位置会抛出此异常。

我可以解决这个问题吗?

2 个答案:

答案 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
            }
        }