1

動的に生成されたハイパーリンクがあり、クリックすると Lotus Notes ドキュメントが開きます。以下のコードを使用してそれを行います。

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)

もう 1 つの興味深い点は、別のスレッドで発生するため、hostingWindow.Navigate メソッドが起動されたときに捕捉されないことです。

何か案は ?

4

2 に答える 2

0

クリックイベントを処理済みとしてマークしてみてください。

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メソッドは使用しないためわかります。

ハイパーリンクボタンにナビゲーションを任せているだけではない理由はありますか?

于 2011-10-06T00:42:57.457 に答える
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;
}
于 2013-01-20T22:26:32.800 に答える