开发者

InvalidOperationException when DataGrid loses focus to a HyperLink

I am having exactly this problem in my Siverlight4 application:

Description There is an error when a datagrid lose focus to a hyperlink (part of a RichTextBox).

The exception details are:

{
System.InvalidOperationException: Reference is not a valid visual DependencyObject.
at System.Windows.Media.VisualTreeHelper.GetRelative(DependencyObject reference, Relati开发者_运维百科veKind 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)
}

To reproduce this error put a DataGrid with some data, and a RichTextBox with at least one Hyperlink, the RichTextBox must have IsReadOnly="True" , and at runtime with the focus on the datagrid, click the hyperlink.

The bug is in the file DataGrid.xaml.cs, line 4782: DependencyObject parent = VisualTreeHelper.GetParent(focusedDependencyObject);

From: http://silverlight.codeplex.com/workitem/7696

The workaround seems to be to edit the Silverlight DLLs, which I'd rather not do.

EDIT: Looks like clicking anywhere throws this exception.

Any other ideas how I could work around this problem?


Why must RichTextBox be readonly? What happens if it is not readonly?

If this is a known bug in the datdgrid then i would consider hacking a if-it-looks-right-it-is-right solution (i think this beats modifying/fixing a dll).

Examples, does it must be a hyperlink? Can it be a textblock instead (which you'd handle the hyperlinking part in code)?


We have come up with a workaround now.

As we are binding to the XALM string of the FlowDocument we have added a new property to the Model for the RichtTextBox to bind to. In that property we are manually removing the hyperlink info and replacing it with BOLD tags.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜