2009-12-10 45 views
1

我正在使用Silverlight 3 HyperlinkButton,我想以编程方式触发单击按钮时通常会发生的导航。似乎没有一种公开的方法支持这一点。以编程方式触发HyperlinkBut​​ton导航

的OnClick方法保护,所以我可以从该控件继承从一个自定义的控制访问该方法,但有没有更好的方式去这件事吗?

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

+0

这个问题仍然存在于SL4(我怀疑SL5)。除了前面介绍的浏览器解决方案之外,我已经更新了我的答案,以包含浏览器外解决方案。 – 2012-03-16 00:39:03

回答

2

对于浏览器中的应用程序,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

请注意,在使用Silverlight 4的当前浏览器(IE8,9,Firefox6..9)中,此技术可能会被阻止。在我的情况下,只使用“HyperlinkBut​​ton”的NavigateUri(数据绑定)其他方法,包括命令。 – jv42 2012-01-05 14:06:02

+0

重写OnClick在Silverlight中使用Chrome或IE :) – 2012-11-09 14:15:26

1

您可以将按钮链接到Command,然后使用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> 

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世界。

+1

我必须缺少一些东西,这是如何帮助我调用受保护的HyperLinkBut​​ton.OnClick方法的? – 2009-12-10 21:12:32

+0

OnClick是一个代码实现,你正在把你的代码隐藏吗?您的OnClick方法中的相同实现可以写在Command委托中。 – 2009-12-11 12:48:10

+0

真棒回答,这帮了我十倍。谢谢+1 – Gabe 2010-07-13 20:41:41

相关问题