2011-02-14 3 views
1

가파른 WPF Mountain을 올라가서 고통 받고 있습니다.UserControl에서 MouseButtonEvent를 발생 시키면 MainWindow는 MouseButtonEventArgs에 대한 액세스 권한이 없습니다.

내가 UserControl을을 정의하고, 내 MainWindow를가 MouseButtonEventArgs 뒤에 UserControl을 코드에서

(예를 들어 마우스 e.GetPosition 같은) UserControl을 내부 컨트롤에서 오는 검색 할 필요가있다, 나는 등록을했을 나는 버블 링 이벤트를 일으킨다.

public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl)); 
    public event RoutedEventHandler MyButtonDown { 
     add { AddHandler(MyButtonDownEvent, value); } 
     remove { RemoveHandler(MyButtonDownEvent, value); } 
    } 
    private void MyMouseButtonDownHandler(object sender, MouseButtonEventArgs e) { 
     RaiseEvent(new RoutedEventArgs(MyButtonDownEvent)); 
    } 

지금 내 MainWindow를에서이 같은 UserControl을 선언

<local:MyUserControl MouseDown="MyUserControl_MouseDown"/> 

그리고

private void MyUserControl_MouseDown(object sender, RoutedEventArgs e) 

뒤에이 코드를 그리고 나는 UserControl에서 이벤트를받을 수 있지만, 인수는 RoutedEventArgs 있습니다 (어떤 정상입니다)하지만 난 마우스 e.GetPosition을 얻는 데 필요한 MouseButtonEventArgs에 대한 액세스 권한이 없습니다.

이 경우 어떤 멋진 해결책을 제안 하시겠습니까?

답변

0

을 생각 드디어 도착을 그것은 (적어도 나는 희망) :

내가 뒤에있는 코드를 작성하는 경우 :

 public event EventHandler<MouseButtonEventArgs> MyRightButtonDownHandler; 
    public void MyRightButtonDown(object sender, MouseButtonEventArgs e) { 
     MyRightButtonDownHandler(sender, e); 
    } 

는 그런 소비자 (MainWindow를) XAML에서 :

<local:GlobalDb x:Name="globalDb" MyRightButtonDownHandler="globalDb_MyRightButtonDownHandler"/> 

그리고 뒤에 소비자 코드

: 당신이 디자인 정책에 의해 (더 나은 솔루션이있는 경우

private void globalDb_MyRightButtonDownHandler(object sender, MouseButtonEventArgs e) { 
     Console.WriteLine("x= " + e.GetPosition(null).X + " y= " + e.GetPosition(null).Y); 
    } 

알려주세요 - 규칙 설립 내가 일하는 곳에서 - 응용 프로그램의 모든 이벤트 처리가 XAML에 나타나야합니다). 당신의 도움을 위해 다시

감사합니다,

+0

solutio를 찾았습니다. –

+0

네, 그게 무슨 뜻인지, 라우트 된 이벤트를 사용하는 것보다 훨씬 간단합니다. 물론 때로는 이벤트를 라우트해야합니다. –

1

UserControl에 이미 일반적인 MouseDown 이벤트가있는 동안 자신의 MouseDown 이벤트를 정의하는 이유는 무엇입니까?

어쨌든 RoutedEventHandler을 사용하도록 이벤트를 정의하면 RoutedEventHandler으로 막히게됩니다.

public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl)); 

주의가 typeof(RoutedEventHandler)을 말한다 비트 :이처럼 선언? 내가 잘못 아냐 경우

코드이 대신과 같아야합니다 : 사용자 정의 이벤트에 대한 기존의 MouseDown 이벤트 전파하는 방법

public static readonly RoutedEvent MyButtonDownEvent = 
     EventManager.RegisterRoutedEvent 
     ("MyButtonDown", 
     RoutingStrategy.Bubble, 
     typeof(MouseButtonEventHandler), 
     typeof(MyUserControl)); 

    public event MouseButtonEventHandler MyButtonDown 
    { 
     add { AddHandler(MyButtonDownEvent, value); } 
     remove { RemoveHandler(MyButtonDownEvent, value); } 
    } 

예 :

InitializeComponent(); 
this.MouseDown += (s, e) => { 
    RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton) 
        { 
         RoutedEvent = MyButtonDownEvent 
        }); 
}; 
+0

안녕하세요 HB는, 당신의 노력 –

+0

안녕하세요 HB 주셔서 감사합니다 당신의 도움을 주셔서 감사합니다. 귀하의 코멘트에 회신하려면 "왜 당신은 UserControl이 이미 정상적인 MouseDown 이벤트를 가지고있는 동안 자신의 MouseDown 이벤트를 정의합니까?".UserControl에서 오는 이벤트를 구독하려면 MainWindow에서 XAML 만 사용하는 방법을 찾지 못했습니다. 또한 코드를 테스트 한 결과 XAML이 형식이 일치하지 않는다고 판단했음을 알았습니다. 어떤 생각? –

+0

아니, 잠시 동안 고쳐 봤지만 해결하지 못했습니다. RoutedEvent로 등록하지 않으시면 아무 문제가 없습니다 (이벤트에 대한 세터와 getter도 제거해야 함) –