2009-12-10 6 views
1

Silverlight 3 HyperlinkButton을 사용하고 있으며 단추를 클릭 할 때 일반적으로 발생하는 탐색을 프로그래밍 방식으로 트리거하고 싶습니다. 이를 지원하는 공개 방법이없는 것 같습니다. 프로그래밍 방식으로 HyperlinkButton 탐색 사용

의 OnClick 방법

그래서 난 사용자 정의 컨트롤에서이 방법에 접근이 컨트롤에서 상속 수있는 보호하지만 이것에 대해 갈 수있는 더 좋은 방법은 무엇입니까?

Reflector을 사용하는 OnClick 메서드의 구현을 보면 코드의 복잡성으로 인해이 이벤트가 프로그래밍 방식으로 트리거되지 않도록하는 것이 좋은 이유가 있는지 궁금하게 생각합니다. 가장 낮은 수준의 관리 코드 호출은 MS.Internal.XcpImports.NavigateToSafeURINative이고 사용할 수있는 코드 경로에는 공용 메서드가 표시되지 않습니다.

+0

이 문제는 아직 SL4에 있습니다 (SL5가 의심됩니다). 앞에서 설명한 브라우저 솔루션 외에도 브라우저 솔루션을 포함하도록 답변을 업데이트했습니다. –

답변

2

브라우저 응용 프로그램의 경우 HtmlWindow.Navigate은 고유 한 대상 이름을 사용하여 Silverlight 응용 프로그램을 호스팅하는 현재 창과 다른 탭이나 창에서 열리도록 다음과 같이 속임수를 사용합니다. 브라우저 응용 프로그램의 아웃

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

은, 내가 찾은 최고의 솔루션은 HyperlinkButton에서 매우 간단한 사용자 정의 클래스를 파생시키고 아래와 같이 차례로 보호 OnClick 메소드를 호출 public 메소드를 구현하는 것입니다. 이 사용자 지정 클래스는 기본 HyperlinkButton과 마찬가지로 적절한 NavigateUri 및 TargetName 속성을 사용하여 XAML에서 선언 할 수 있습니다. 리플렉션을 통해 OnClick 메서드를 호출하여 사용자 지정 클래스를 만드는 것을 피하기를 희망했지만 Silverlight Security Considerations for Reflection 때문에 불가능합니다.

+1

이 기술은 Silverlight 4를 사용하는 현재 브라우저 (IE8,9, Firefox 6..9)에서 차단 될 수 있습니다. 'HyperlinkButton'의 'NavigateUri' (데이터 바인딩) 만 사용하는 경우가 아니라 내 경우에는 작동합니다 명령을 포함한 다른 방법. – jv42

+0

OnClick을 무시하고 Chrome 또는 IE에서 Silverlight로 작업했습니다. –

1

단추를 명령에 연결 한 다음 Command.Execute()를 사용하여 Code의 아무 곳이나 명령을 트리거 할 수 있습니다. 사이비 코드 :

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 뒤) :이 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); 
    } 
} 

.

+1

무언가를 놓치고 있어야합니다. 어떻게하면 보호 된 HyperLinkButton.OnClick 메서드를 호출하는 데 도움이됩니까? –

+0

OnClick은 코드 숨김에 넣고 자하는 코드 구현입니까? OnClick 메서드의 동일한 구현을 명령 대리자 내부에 작성할 수 있습니다. –

+0

굉장한 대답, 이것은 나를 10 배나 도왔습니다. 감사합니다 +1 – Gabe

관련 문제