2012-07-04 3 views
3

ContentControl에서 파생 된 새 사용자 지정 컨트롤을 만들려고합니다. (이 컨트롤은 윈도우의 다른 컨트롤에 대한 컨테이너입니다.) 버튼을 닫으려고합니다. (사실 경계없는 창을 원하지만 시스템과 유사한 버튼을 사용하면 창을 닫을 수 있습니다).Button.Click 사용자 지정 컨트롤

두 행이있는 Grid가 포함 된 컨트롤의 스타일을 만들었습니다. 상단 행에 단일 버튼이있는 StackPanel이 있습니다.

단추의 Click 이벤트를 컨트롤 자체에 바인딩하거나, 이벤트를 발생 시키거나, 부모 창에 닫기 명령을 보낼 수 있습니까?

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition Height="20" /> 
    <RowDefinition /> 
</Grid.RowDefinitions> 
<Border Background="Azure" Grid.Row="0"> 
    <StackPanel Orientation="Horizontal"> 
     <Button HorizontalAlignment="Right" Content="X" Click="Close_Click" /> 
    </StackPanel> 
    </Border> 
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1"/> 
</Grid> 

그리고 뒤에있는 코드 :

static STContentControl() 
{ 
DefaultStyleKeyProperty.OverrideMetadata(typeof(STContentControl), new FrameworkPropertyMetadata(typeof(STContentControl))); 
} 

public void Close_Click(object sender, RoutedEventArgs ea) 
{ 

} 
+0

원하는 항목을 잘 모름 - 버튼을 클릭 할 때 발생하는 제어 이벤트에 대한 클릭 이벤트를 생성했는지, 어떤 부모 창에 대해 이야기하고 있는지, 클릭을 바인딩한다는 것은 무엇을 의미합니까? 자신에게? 왜 클릭 자체를 바인딩하고 싶습니까? 이미 클릭 핸들러가 있습니까? 컨트롤의 레이아웃과 버튼을 클릭했을 때 발생할 것으로 예상되는 것을 설명 할 수 있습니까? – Charleh

+0

이 컨트롤이 포함 된 창을 닫는 버튼이 포함 된 콘텐트 컨트롤이 필요합니다. 코드 부분은 필자가 작성한 컨트롤의 일부입니다. 이 빌드를 시도 할 때 Click 이벤트를 사용할 수 없다거나 또는 컨트롤의 기본 템플릿이 들어있는 ResourceDictionary 머리글에 x : Class 특성을 사용해야한다는 오류가 발생합니다. 머리글에 넣은 후 Close_Click 클래스에서 찾을 수 없습니다. –

답변

2

그것은 런타임에 컨트롤에 적용되는, 그래서 당신이 리소스로 템플릿을 만든처럼 들린다.

OnApplyTemplate 메서드의 단추에 대한 클릭 이벤트를 연결해야합니다 (컨트롤에서 재정의).

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx

그래서 당신은 다음처럼 UC에이 메소드를 오버라이드 (override) 할 :

class NewUC : UserControl 
{ 
    public event EventHandler CloseClicked; 

    public override void OnApplyTemplate() 
    { 
     Button btn = this.FindName("SomeButton") as Button; 

     if (btn == null) throw new Exception("Couldn't find 'Button'"); 

     btn.Click += new System.Windows.RoutedEventHandler(btn_Click); 
    } 

    void btn_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     OnCloseClicked(); 
    } 

    private void OnCloseClicked() 
    { 
     if (CloseClicked != null) 
      CloseClicked(this, EventArgs.Empty); 
    } 
}  

나는 당신이 당신의 부모 창에 처리 할 수있는 예에 CloseClicked 이벤트를 추가했다. 이것은 라우트 된 이벤트가 아니므로 상위 컨트롤에서 수동으로 와이어 링해야합니다.

Methinks 또한 MouseLeftButtonDown 라우트 된 이벤트를 사용하고 버튼이 부모 레벨에서 클릭되었는지 확인하여 이동합니다. 자신 ...

+0

고마워, 그게 효과가있어 :) –

+1

와우, 너는 빨리 일한다 : D – Charleh

+0

내가 알기를, 내가 무엇을 할 지, 나는 천둥과 같다. –