2016-10-29 1 views
0

내 WPF 응용 프로그램에서 사용할 수있는 사용자 지정 ToolBar 컨트롤을 만들고 있습니다.Click 이벤트가없는 컨트롤로 구성된 사용자 지정 WPF 컨트롤에서 Click 이벤트를 처리하는 방법

내 CustomToolBar 컨트롤은 StackPanel 컨트롤을 기반으로하며 여러 CustomToolBarButton 컨트롤을 포함합니다.

내 CustomToolBarButton은 세로 StackPanel을 기반으로하며 이미지 컨트롤과 레이블 컨트롤을 포함합니다.

이미지 또는 레이블을 클릭 할 때 발생하는 CustomToolBarButton에 대한 Click 이벤트를 프로그래밍 방식으로 만들길 원합니다. 아쉽게도 이미지 컨트롤이나 레이블 컨트롤에는 WPF에서 Click 이벤트가 없습니다.

WinForms 컨트롤에 익숙하기 때문에 놀랍습니다. 대다수의 플레이어는 기본적으로 Click 이벤트를 사용하기 때문에 놀랍습니다. 사용자 정의 이미지 및 레이블 컨트롤을 만들고 클릭 이벤트를 만들어야합니까, 아니면 더 간단하고 간편한 방법이 있습니까?

도움 주셔서 감사합니다.

답변

1

글쎄, 표준 기능을 사용하는 크고 간단한 방법은 없습니다. 나는 (블렌드 SDK에서 System.Windows.Interactivity.TriggerBase에서 파생 된) 내 자신의 트리거를 만들어이 문제를 가지고 그래서 내 프로젝트에 나는 다음을 수행 할 수 효과적으로 MouseTrigger 클래스는 년대 UIElement에서 MouseDown 및 이는 MouseUp 이벤트를 처리 할

 <Label> 
     <i:Interaction.Triggers> 
      <mu:MouseTrigger MouseButton="Middle" MouseAction="Click"> 
       <i:InvokeCommandAction Command="{Binding Path=Close}" /> 
      </mu:MouseTrigger> 
     </i:Interaction.Triggers> 
    </Label> 

을 그것에 첨부되어 트리거와 연관된 조치를 호출하는 데 사용됩니다. 이 코드는 마우스 캡쳐를하기 때문에 조금 복잡합니다. & 내부 도우미 클래스를 사용하여 도우미 클래스의 한 인스턴스 만 사용하여 동일한 요소에 여러 개의 트리거를 추가 할 수 있습니다. & 해당 요소에 대한 마우스.

실제 작업에 대해서는 기존의 블렌드 또는 프리즘 액션 (예 : InvokeCommandAction)을 사용합니다.

여기에 the project이 있습니다. 이 형식으로 붙여 넣기에는 너무 큽니다. 일부 C# 6.0 기능을 사용하지만 일부 null 조건부 연산자를 제거하여 이전 버전의 C#에서 작동하도록 쉽게 수정할 수 있습니다. System.Windows.Interactivity에 따라 Blend SDK를 설치해야합니다 (해당 옵션을 선택하는 동안 Visual Studio와 함께 설치해야 함). MouseTrigger은 기능과의 상호 작용 지점 인 공개적으로 볼 수있는 클래스입니다. MouseCatcher은 언급 된 내부 도우미 클래스입니다.

사용자 지정 컨트롤 경로를 사용하지 말고 WPF 및 XAML이 테이블에 가져 오는 첨부 된 속성 프레임 워크를 사용하여 기존 기능을 확장하기 위해 일부 메커니즘 (이 방법 또는 다른 방법)을 사용하는 것이 좋습니다.

1

WinForms에서는 비표준 모양을 얻기 위해 사용자 지정 컨트롤을 만들면 WPF에서 더 이상 필요하지 않습니다.

WPF 방법

: 대신 Stackpanel의 아이들이 Click 동작을 구현 만드는,의는 Button보기 원하는 Stackpanel처럼 만들어 보자.

이이 설정을 할 수 있 었는가 Content :

<Button> 
    <StackPanel > 
     <Image Source="C:\myFiles\myPic.png"/> 
     <Label HorizontalAlignment="Center">SomeTxt</Label> 
    </StackPanel> 
</Button> 

하지만 여전히 Button처럼 보이는 이러한 방법으로, 우리가 설정할 수 있습니다이를 극복하기 위해 Template 대신 :

<Button> 
    <Button.Template> 
     <ControlTemplate TargetType="Button"> 
      <StackPanel > 
       <Image Source="C:\myFiles\myPic.png"/> 
       <Label HorizontalAlignment="Center">SomeTxt</Label> 
      </StackPanel> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

두 솔루션이 인상됩니다 이미지 또는 레이블을 클릭하여 이벤트를 클릭하십시오.

관련 문제