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

Try маркировка события щелчка как обработанные:

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 не работает.

Есть ли причина, по которой вы не просто позволяете кнопке гиперссылки делать навигацию?

+0

Причина, почему я не могу просто позволить кнопку гиперссылкой сделать навигацию в том, что вместо того, чтобы идти на обычный адрес веб-сайта он должен перейти в документ Lotus Notes (который нот формы : // <путь к документу>). В кликах Silverlink гиперссылки не работают с этой формой целевых URL-адресов. Да, вы правы, что исключение происходит в их коде. И так как это происходит в другом потоке, и поэтому попадает только в App.xaml.cs, а не в фактический вызов hostingWindow.Navigate (hlb.NavigateUri); что вызвало навигацию. –

+0

Так почему бы просто не использовать другой тип управления, который выглядит как кнопка гиперссылки и атакует обработчик события события click. – Bryant

 Смежные вопросы

  • Нет связанных вопросов^_^