单击链接时出现Silverlight InvalidOperationException

单击链接时出现Silverlight InvalidOperationException,silverlight,hyperlink,onclick,lotus-notes,invalidoperationexception,Silverlight,Hyperlink,Onclick,Lotus Notes,Invalidoperationexception,我有一个动态生成的超链接,单击它应该会打开LotusNotes文档。我用下面的代码来做 HyperlinkButton hlb = new HyperlinkButton(); hlb.SetBinding(HyperlinkButton.ContentProperty, new Binding("Properties[" + col.DisplayField + "]")); hlb.SetBinding(HyperlinkButton.NavigateUriProperty, new Bin

我有一个动态生成的超链接,单击它应该会打开LotusNotes文档。我用下面的代码来做

HyperlinkButton hlb = new HyperlinkButton();
hlb.SetBinding(HyperlinkButton.ContentProperty, new Binding("Properties[" + col.DisplayField + "]"));
hlb.SetBinding(HyperlinkButton.NavigateUriProperty, new Binding("Properties[" + col.LinkField + "]"));
hlb.Click += new RoutedEventHandler(hlb_Click);
RootGrid.Children.Add(hlb);
这是单击链接时激发的代码

static void hlb_Click(object sender, RoutedEventArgs e)
{
    HyperlinkButton hlb = (HyperlinkButton)sender;
    var hostingWindow = HtmlPage.Window;
    hostingWindow.Navigate(hlb.NavigateUri);
}
lotus notes文档正确打开,但我得到一个System.InvalidOperationException,其详细信息如下所示

Description: Failed to navigate to notes://<path to the document>

Stacktrace:
at MS.Internal.NavigationHelper.Navigate(Boolean checkUserInitiatedAction)
at System.Windows.Controls.HyperlinkButton.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
Description:无法导航到注释://
堆栈跟踪:
在MS.Internal.NavigationHelper.Navigate(布尔值checkUserInitiateAction)
在System.Windows.Controls.HyperlinkButton.OnClick()中
在System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
在System.Windows.Controls.Control.OnMouseLeftButtonUp(控件ctrl,事件参数e)
在MS.Internal.JoltHelper.firevent处(IntPtr unmanagedObj、IntPtr unmanagedobjars、Int32 argsTypeIndex、Int32 actualgstypeindex、String eventName)
需要注意的另一件有趣的事情是,它是在另一个线程上引发的,因此在启动hostingWindow.Navigate方法时不会被捕获


有什么想法吗?

尝试将单击事件标记为已处理:

static void hlb_Click(object sender, RoutedEventArgs e)
{
    e.Handled = true;
    HyperlinkButton hlb = (HyperlinkButton)sender;
    var hostingWindow = HtmlPage.Window;
    hostingWindow.Navigate(hlb.NavigateUri);
}
我不确定这是否能解决这个问题。错误来自超链接按钮内的单击事件代码。您可以判断,因为代码使用NavigationHelper类,而Window.Navigate方法不使用


有什么理由不让超链接按钮进行导航吗?

使用Silverlight 5,我将打开Lotus Notes文档链接的调用包装在一个任务中,并且能够在不产生错误的情况下打开链接

private void TryOpenDocLink()
{
    TaskScheduler ts = TaskScheduler.Default;

    Task<bool> task = OpenDocLink();

    task.ContinueWith(t =>
    {
        if (t.Exception != null)
        {
            this.SetError(t.Exception.Message, enMessageLevel.Error);
        }
    });
}

private Task<bool> OpenDocLink()
{
    TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();

    try
    {
        var hostWindow = HtmlPage.Window;
        hostWindow.Navigate(new Uri(DocLinkPath));
        tcs.SetResult(true);
    }
    catch (Exception)
    {
        tcs.SetResult(false);
    }

    return tcs.Task;
}
private void TryOpenDocLink()
{
TaskScheduler ts=TaskScheduler.Default;
任务Task=OpenDocLink();
task.ContinueWith(t=>
{
if(t.Exception!=null)
{
this.SetError(t.Exception.Message,enMessageLevel.Error);
}
});
}
私有任务OpenDocLink()
{
TaskCompletionSource tcs=新的TaskCompletionSource();
尝试
{
var hostWindow=HtmlPage.Window;
导航(新Uri(DocLinkPath));
tcs.SetResult(真);
}
捕获(例外)
{
tcs.SetResult(假);
}
返回tcs.Task;
}

我不能让超链接按钮进行导航的原因是,它必须转到lotus notes文档(格式为notes://),而不是常规的web地址。在Silverlight中,单击超链接按钮不适用于这种形式的目标URL。是的,您是对的,异常发生在他们的代码中。由于它发生在另一个线程上,因此只能在App.xaml.cs中捕获,而不是在实际的调用hostingWindow.Navigate(hlb.NavigateUri)中捕获;这导致了导航。那么为什么不使用另一种看起来像超链接按钮的控件,并攻击事件处理程序来点击事件呢。