以编程方式触发HyperlinkBut​​ton导航

时间:2009-12-10 03:56:24

标签: silverlight navigation

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

OnClick 方法受保护,因此我可以从此控件继承以从自定义控件获取对此方法的访问权限,但是有更好的方法可以解决此问题吗?

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

2 个答案:

答案 0 :(得分:2)

对于in浏览器应用程序,HtmlWindow.Navigate执行如下操作,依赖于唯一的目标名称,以确保它在托管Silverlight应用程序的当前窗口的不同选项卡或窗口中打开。

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

对于浏览器外的应用程序,我找到的最佳解决方案是从HyperlinkButton派生一个非常简单的自定义类,并实现一个公共方法,该方法又调用受保护的OnClick方法,如下所示。可以在XAML中使用适当的NavigateUri和TargetName属性声明此自定义类,就像基本HyperlinkBut​​ton一样。我希望通过反射调用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 :(得分:1)

您可以将按钮链接到Command,然后使用Command.Execute()从Code中的任何位置触发命令。 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>

CODE(后面或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世界中效果特别好。