2009-12-10 76 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

相關問題