Silverlight 以编程方式触发HyperlinkButton导航

Silverlight 以编程方式触发HyperlinkButton导航,silverlight,navigation,Silverlight,Navigation,我正在使用Silverlight 3,我希望通过编程触发通常在单击按钮时发生的导航。似乎没有支持此功能的公共方法 OnClick方法受保护,因此我可以从该控件继承,以便从自定义控件访问该方法,但有更好的方法吗 使用查看OnClick方法的实现并没有给我一个更好的方法的明显提示,代码的复杂性让我想知道是否有一个很好的理由不允许以编程方式触发此事件。最低级别的托管代码调用是对MS.Internal.XcpImports.NavigateToSafeUrative的调用,我在代码路径中看不到可以使用的

我正在使用Silverlight 3,我希望通过编程触发通常在单击按钮时发生的导航。似乎没有支持此功能的公共方法

OnClick方法受保护,因此我可以从该控件继承,以便从自定义控件访问该方法,但有更好的方法吗


使用查看OnClick方法的实现并没有给我一个更好的方法的明显提示,代码的复杂性让我想知道是否有一个很好的理由不允许以编程方式触发此事件。最低级别的托管代码调用是对MS.Internal.XcpImports.NavigateToSafeUrative的调用,我在代码路径中看不到可以使用的任何公共方法。

对于浏览器内应用程序,执行以下操作:,依赖唯一的目标名称,以确保它在承载silverlight应用程序的当前窗口的不同选项卡或窗口中打开

var hostingWindow = HtmlPage.Window;
hostingWindow.Navigate(siteHyperLinkbutton.NavigateUri, siteHyperLinkbutton.TargetName); 
对于浏览器外应用程序,我找到的最佳解决方案是从中派生一个非常简单的自定义类,并实现一个公共方法,该方法反过来调用受保护的方法,如下所示。可以使用适当的NavigateUri和TargetName属性在XAML中声明此自定义类,就像基本HyperlinkButton一样。我希望通过反射调用OnClick方法来避免创建自定义类,但这是不可能的,因为

公共类CustomHyperlinkButton:HyperlinkButton
{
/// 
///将受基本保护的OnClick方法公开为公共方法。
/// 
public void OnClickPublic()
{
OnClick();
}
}

您可以将按钮链接到命令,然后使用Command.Execute()从代码的任何位置触发该命令。Psuedo代码:

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);
    }
}
公共类类名
{    
///类构造函数
公共类名()
{///以委托的形式实现命令行为
MyCommand=新的DelegateCommand(
代表{
///在这里执行OnClick()行为实现
}
);
}
私有DelegateCommand _myCommand;
公共DelegateCommand MyCommand
{
获取{return\u myCommand;}
设置{myCommand=value;
OnPropertyChanged(“MyCommand”);}
}
///从代码中的其他地方调用的另一个方法
void SomeOtherMethod()
{
MyCommand.Execute(空);
}
}

这在MVVM世界中尤其有效。

我肯定遗漏了一些东西,这如何帮助我调用受保护的HyperLinkButton.OnClick方法?OnClick是一个代码实现,您正在将代码放在后面,对吗?您的OnClick方法中的相同实现也可以写在命令委托中。感谢+1请注意,Silverlight 4可能会在当前浏览器(IE8,9、Firefox 6..9)中阻止此技术。在我的案例中,仅使用
HyperlinkButton
NavigateUri
(数据绑定)才有效,而没有任何其他方法。(我在复制另一个答案下面的注释)@MarkCooper OnClick方法包含执行导航的实现,我想执行的就是这段代码。您可以订阅单击事件,在这种情况下,除了OnClick代码路径之外,还将调用代码隐藏实现,但这无助于触发单击事件。请注意,此技术可能在当前浏览器(IE8,9,Firefox 6..9)和Silverlight 4中被阻止。仅使用
HyperlinkButton
NavigateUri
(数据绑定)在我的情况下有效,没有任何其他方法,包括命令。使用Chrome或IE在Silverlight中重写OnClick对我有效:)这个问题在SL4中仍然存在(我怀疑是SL5)。我已经更新了我的答案,除了我前面描述的浏览器内解决方案之外,还包括了浏览器外解决方案。
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);
    }
}