2009-12-10 6 views
1

Я использую Silverlight 3 HyperlinkButton, и я хочу программно запускать навигацию, которая обычно возникает при нажатии кнопки. По-видимому, не существует общедоступного метода, который поддерживает это.Программный запуск навигации HyperlinkButton

OnClick метод защищен, так что я мог наследовать от этого управления, чтобы получить доступ к этому методу от таможенного контроля, но есть лучший способ пойти по этому поводу?

Рассмотрение реализации метода OnClick с использованием Reflector не дает мне явного намека на лучший способ, и сложность кода заставляет задуматься, есть ли веские основания не допускать, чтобы это событие запускалось программно. Кодирование с низким уровнем управляемого кода - MS.Internal.XcpImports.NavigateToSafeURINative, и я не вижу никакого общедоступного метода в коде кода, который я мог бы использовать.

+0

Этот вопрос все еще присутствует в SL4 (и я подозреваю SL5). Я обновил свой ответ, чтобы включить решение для браузера в дополнение к решению в браузере, которое я описал ранее. –

ответ

2

Для приложения в браузере HtmlWindow.Navigate выполняет трюк следующим образом, опираясь на уникальное имя цели, чтобы убедиться, что он открывается в другой вкладке или окне в текущее окно, на котором размещается приложение silverlight.

var hostingWindow = HtmlPage.Window; 
hostingWindow.Navigate(siteHyperLinkbutton.NavigateUri, siteHyperLinkbutton.TargetName); 

Для отказа от применения браузера, лучшее решение, которое я нашел, чтобы получить очень простой пользовательский класс от HyperlinkButton и осуществлять публичный метод, который, в свою очередь вызывающую защищенный OnClick метод, как показано ниже. Этот пользовательский класс может быть объявлен в XAML с соответствующими свойствами NavigateUri и TargetName, как и базовый HyperlinkButton. Я надеялся избежать создания пользовательского класса, вызвав метод OnClick через отражение, но это невозможно из-за Silverlight Security Considerations for Reflection.

public class CustomHyperlinkButton : HyperlinkButton 
    { 
     /// <summary> 
     /// Exposes the base protected OnClick method as a public method. 
     /// </summary> 
     public void OnClickPublic() 
     { 
      OnClick(); 
     } 
    } 
+1

Обратите внимание: эта техника может быть заблокирована в текущих браузерах (IE8,9, Firefox 6..9) с помощью Silverlight 4. Только использование 'NavigateUri' (привязки данных)' HyperlinkButton' действительно работало в моем случае, а не другой метод, включая команду. – jv42

+0

Overriding OnClick работал для меня в Silverlight с Chrome или IE :) –

1

Вы можете связать кнопку с командой, а затем запустить команду в любом месте из кода с помощью команды Command.Execute(). Код псевдопользователей:

XAML:

<UserControl x:Class="ClassName" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:commands="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"> 
    <Button commands:Click.Command="{Binding MyCommand}" /> 
</UserControl> 

КОД (сзади или MVVM):

public class ClassName 
{  
    ///Class constructor 
    public ClassName() 
    {  /// implement the command behaviour as a delegate 
    MyCommand = new DelegateCommand<object>(
     delegate{ 
       /// do your OnClick() behaviour implementation here 
       } 
     ); 
    } 

    private DelegateCommand<object> _myCommand; 
    public DelegateCommand<object> MyCommand 
    { 
     get { return _myCommand; } 
     set { myCommand=value; 
       OnPropertyChanged("MyCommand");} 
    } 

    /// Another method called from somewhere else in code 
    void SomeOtherMethod() 
    { 
     MyCommand.Execute(null); 
    } 
} 

Это особенно хорошо работает в MVVM мире.

+1

Мне что-то не хватает, как это помогает мне вызвать защищенный метод HyperLinkButton.OnClick? –

+0

OnClick - это реализация кода, которую вы вставляете в свой код? Та же реализация в вашем методе OnClick может быть записана внутри делегата Command. –

+0

Удивительный ответ, это помогло мне в десять раз. Спасибо +1 – Gabe

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