1

我有一個動態生成的超鏈接,點擊時應該打開一個蓮花筆記文檔。我用下面的代碼來做。Silverlight InvalidOperationException點擊鏈接時

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) 

另一個有趣的事情要注意的是,它是在另一個線程,因此上調在啓動hostingWindow.Navigate方法時不會被捕獲。

任何想法?

回答

0

使用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; 
} 
0

嘗試標誌着點擊事件作爲處理:

​​

我不知道,這將解決這個問題。該錯誤來自超鏈接按鈕內的單擊事件代碼。您可以知道,因爲該代碼使用NavigationHelper類,而Window.Navigate方法不使用。

有沒有你不只是讓超鏈接按鈕做導航的理由?

+0

的原因,我不能只讓超鏈接按鈕做導航是不是要去正規網址它去Lotus Notes文檔(這是形式 筆記:// <路到文檔>)。在Silverlight超鏈接按鈕點擊不支持這種形式的目標網址。是的,您的代碼中發生異常是正確的。並且因爲它發生在另一個線程上,所以只能在App.xaml.cs中捕獲,而不是實際調用hostingWindow.Navigate(hlb.NavigateUri);導致導航。 –

+0

那麼,爲什麼不使用看起來像超鏈接按鈕的其他類型的控件,並且將事件處理程序攻擊爲click事件。 – Bryant