2

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

编辑:看起来单击任何地方都会引发此异常。

还有什么其他想法可以解决这个问题吗?

4

2 回答 2

0

为什么 RichTextBox 必须是只读的?如果它不是只读的会发生什么?

如果这是 datdgrid 中的一个已知错误,那么我会考虑破解一个 if-it-looks-right-it-is-right 解决方案(我认为这胜过修改/修复 dll)。

示例,它必须是超链接吗?它可以是一个文本块(你会在代码中处理超链接部分)吗?

于 2011-05-06T23:38:31.950 回答
0

我们现在想出了一个解决方法。

当我们绑定到 FlowDocument 的 XALM 字符串时,我们向模型添加了一个新属性,以便 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
            }
        }
于 2011-05-07T12:33:30.737 回答