Caliburn.Micro는 Behavior 이벤트에 이벤트 핸들러를 첨부합니다.

zrkl

스 와이프 제스처를 처리하기 위해 내 자신의 Behavior를 작성하여 ListView의 ItemTemplate에 넣었습니다. 스 와이프가 완료되면 LeftSwipe 또는 RightSwipe에 대한 이벤트를 발생시킵니다. 이 이벤트는 내 ViewModel에서 처리해야합니다.

Caliburn.Micro 구문을 사용하여 이벤트에 핸들러를 첨부합니다 cm:Message.Attach="[Event LeftSwipe] = [LeftSwipe($source, $eventArgs)"..

이것은 내 행동입니다.

public class SwipeInteractionBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; private set; }

    public void Attach(DependencyObject associatedObject)
    {
        // ...
    }

    public void Detach()
    {
        // ...
    }

    public event EventHandler LeftSwipe;

    public event EventHandler RightSwipe;

    // ...
    // ...

    private void OnLeftSwipe(FrameworkElement element)
    {
        // ...

        if (LeftSwipe != null)
        {
            LeftSwipe(this, EventArgs.Empty);
        }
    }

    private void OnRightSwipe(FrameworkElement element)
    {
        // ...
        if (RightSwipe != null)
        {
            RightSwipe(this, EventArgs.Empty);
        }

    }
}

이것은 ListViews ItemTemplate 내에서이 동작을 사용하는 방법입니다.

        <ListView x:Name="Links" IsItemClickEnabled="True" SelectionMode="None" cm:Message.Attach="[Event ItemClick] = [Click($source, $eventArgs)]">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid>
                            <Border x:Name="todoItem" Loaded="Border_Loaded" Background="White">
                                <i:Interaction.Behaviors>
                                    <local:SwipeInteractionBehavior cm:Message.Attach="[Event LeftSwipe] = [LeftSwipe($source, $eventArgs)]" />
                                </i:Interaction.Behaviors>

                                <Grid>
                                    <StackPanel>
                                        <TextBlock Text="{Binding Title}" Style="{ThemeResource ListViewItemContentTextBlockStyle}" />
                                        <TextBlock Text="{Binding Url}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
                                        <TextBlock Text="{Binding Tags, Converter={StaticResource ListToString}}" />
                                    </StackPanel>
                                </Grid>
                            </Border>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

LeftSwipe 이벤트를 발생 시키면 예외가 발생했습니다. 이것이 내 StackTrace입니다.

System.Exception was not handled.
  HResult=-2146233088
  Message=No target found for method LeftSwipe.
  Source=Caliburn.Micro.Platform
  StackTrace:
       at Caliburn.Micro.ActionMessage.Invoke(Object eventArgs)
       at Caliburn.Micro.TriggerAction`1.Execute(Object sender, Object parameter)
       at Microsoft.Xaml.Interactivity.Interaction.ExecuteActions(Object sender, ActionCollection actions, Object parameter)
       at Microsoft.Xaml.Interactions.Core.EventTriggerBehavior.OnEvent(Object sender, Object eventArgs)
       at ReaderApp.SwipeInteractionBehavior.<>c__DisplayClass5.<OnLeftSwipe>b__4()
       at ReaderApp.Extensions.FrameworkElementExtension.<>c__DisplayClass2.<Animate>b__0(Object s, Object e)
  InnerException: 

ViewModel :

public class MainViewModel : ViewModelBase
{
    private readonly IEventAggregator eventAggregator;
    private readonly Database database;

    public BindableCollection<Link> Links
    {
        get;
        private set;
    }

    public MainViewModel(INavigationService navigationService, IEventAggregator eventAggregator, Database database)
        : base(navigationService)
    {
        this.eventAggregator = eventAggregator;
        this.database = database;

        Links = new BindableCollection<Link>();
    }

    public async void LeftSwipe(object sender, EventArgs e)
    {
        // ...
    }

    public void RightSwipe(object sender, EventArgs e)
    {
        // ...
    }
}
나이젤 샘슨

따라서 문제는 ActionMessage상속 TriggerAction<FrameworkElement>한다는 것 SwipeInteractionBehavior입니다. 즉.

또한 WPF / Silverlight / Windows Phone 8 상호 작용 SDK와 WinRT 상호 작용 SDK간에 몇 가지 주요 API 차이가 있다는 사실로 인해 복잡합니다. Parser 주석 에서 내가 의미하는 바를 약간 볼 수 있습니다 .

내가 권장하는 것은 트리거 동작SwipeInteractionBehavior 으로 구현 하는 것입니다. 예전 에는 별도의 기본 클래스 였지만 WinRT에서는 여전히 그렇습니다 . 차이점은 Actions of type이라는 속성이 있다는 것 입니다. 어리석게도 인터페이스가 없기 때문에 이것을 적용하는 기본 클래스가 있으므로 Caliburn.Micro는 몇 가지 가정을하고 있습니다.EventTriggerBehaviorIBehaviorActionCollection

그런 다음 Interaction.ExecuteActions이러한 작업을 트리거하는 데 사용 하면 결국 xaml이 다음과 같이 보일 것입니다.

<Border x:Name="SwipeTarget">
  <i:Interaction.Behaviors>
    <local:SwipeEventBehavior Direction="Left">
      <cm:ActionMessage AssociatedObject="{Binding ElementName=SwipeTarget" Method="LeftSwipe" />
    </local:SwipeEventBehavior>
  </i:Interaction.Behaviors>
</Border>

좀 더 오래 걸리지 만 SDK 변경으로 인해 부과 된 제한 사항을 해결해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다debugcn@gmail.com 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Caliburn.Micro로 여러 이벤트에 연결

분류에서Dev

동적으로 추가 된 이벤트 핸들러는 자바 스크립트에서 이전 이벤트 핸들러를 비활성화합니다.

분류에서Dev

예외를 던진 객체가 이벤트 핸들러에서 생성 된 경우 전역 이벤트 핸들러에는 세부 정보가 없습니다.

분류에서Dev

canvas.bind (event, handler)는 이벤트 핸들러에 이벤트를 어떻게 전달합니까?

분류에서Dev

jQuery 콤보 박스는 on blur 이벤트를 첨부합니다.

분류에서Dev

JavaScript에서 다양한 이벤트에 대한 단일 이벤트 핸들러를 만드는 방법

분류에서Dev

이벤트 핸들러를 기다리는 AsyncEx DeferralManager

분류에서Dev

이벤트 핸들러를 다른 변수에 복사하는 이유

분류에서Dev

PhotoSwipe : 'init'이벤트 또는 플러그인이 라이트 박스를 열 때 이벤트 핸들러를 첨부하는 방법이 있습니까?

분류에서Dev

Xaml.Behaviors.Wpf가있는 Caliburn Micro, 이벤트 트리거에 actionmessage를 포함 할 수 없음

분류에서Dev

WPF Ribbon Fluent : DropDownButton + Caliburn.Micro 이벤트

분류에서Dev

이벤트 핸들러가 문서에 첨부되었는지 확인

분류에서Dev

Java는 여러 버튼에서 이벤트 핸들러를 동적으로 깔끔하게 사용합니다.

분류에서Dev

이벤트 핸들러는 이벤트 소스에 작용

분류에서Dev

Vue.js는 바운드 데이터를 클릭 이벤트 핸들러에 전달합니다.

분류에서Dev

이벤트 및 컨텍스트를 전달하는 Pytest 람다 핸들러

분류에서Dev

핸들러 내부에서 이벤트 핸들러가 첨부 된 요소를 어떻게 얻습니까?

분류에서Dev

컨트롤러가있는 Caliburn.Micro?

분류에서Dev

핸들러에 의해 방지되지 않는 경우에만 이벤트를 트리거합니까?

분류에서Dev

Hashchange 이벤트 리스너는 이벤트 핸들러가 이벤트에 연결되기 전에 수신합니다.

분류에서Dev

여러 ViewModel이있는 Caliburn.micro

분류에서Dev

원하는 이벤트에 적합한 핸들러를 찾을 수 없습니다.

분류에서Dev

요소가 페이지에있는 즉시 이벤트 핸들러를 HTML 요소에 첨부하는 방법이 있습니까?

분류에서Dev

vuejs에서 부모와 자식 요소 사이에 클릭 이벤트 핸들러를 분리하는 방법

분류에서Dev

JavaScript의 이벤트 핸들러는 이벤트 루프에서 어떻게 처리됩니까?

분류에서Dev

CollectionViewSource.Filter 이벤트의 이벤트 핸들러에서 e와 item의 용도는 무엇입니까?

분류에서Dev

jest에서 지연된 이벤트 핸들러를 테스트하는 방법은 무엇입니까?

분류에서Dev

하나의 핸들러에서 여러 변경 이벤트를 처리하는 방법은 무엇입니까?

분류에서Dev

typescript를위한 강력한 형식의 이벤트 패키지입니다. 이벤트에 바인딩 된 핸들러를 추가하는 방법

Related 관련 기사

  1. 1

    Caliburn.Micro로 여러 이벤트에 연결

  2. 2

    동적으로 추가 된 이벤트 핸들러는 자바 스크립트에서 이전 이벤트 핸들러를 비활성화합니다.

  3. 3

    예외를 던진 객체가 이벤트 핸들러에서 생성 된 경우 전역 이벤트 핸들러에는 세부 정보가 없습니다.

  4. 4

    canvas.bind (event, handler)는 이벤트 핸들러에 이벤트를 어떻게 전달합니까?

  5. 5

    jQuery 콤보 박스는 on blur 이벤트를 첨부합니다.

  6. 6

    JavaScript에서 다양한 이벤트에 대한 단일 이벤트 핸들러를 만드는 방법

  7. 7

    이벤트 핸들러를 기다리는 AsyncEx DeferralManager

  8. 8

    이벤트 핸들러를 다른 변수에 복사하는 이유

  9. 9

    PhotoSwipe : 'init'이벤트 또는 플러그인이 라이트 박스를 열 때 이벤트 핸들러를 첨부하는 방법이 있습니까?

  10. 10

    Xaml.Behaviors.Wpf가있는 Caliburn Micro, 이벤트 트리거에 actionmessage를 포함 할 수 없음

  11. 11

    WPF Ribbon Fluent : DropDownButton + Caliburn.Micro 이벤트

  12. 12

    이벤트 핸들러가 문서에 첨부되었는지 확인

  13. 13

    Java는 여러 버튼에서 이벤트 핸들러를 동적으로 깔끔하게 사용합니다.

  14. 14

    이벤트 핸들러는 이벤트 소스에 작용

  15. 15

    Vue.js는 바운드 데이터를 클릭 이벤트 핸들러에 전달합니다.

  16. 16

    이벤트 및 컨텍스트를 전달하는 Pytest 람다 핸들러

  17. 17

    핸들러 내부에서 이벤트 핸들러가 첨부 된 요소를 어떻게 얻습니까?

  18. 18

    컨트롤러가있는 Caliburn.Micro?

  19. 19

    핸들러에 의해 방지되지 않는 경우에만 이벤트를 트리거합니까?

  20. 20

    Hashchange 이벤트 리스너는 이벤트 핸들러가 이벤트에 연결되기 전에 수신합니다.

  21. 21

    여러 ViewModel이있는 Caliburn.micro

  22. 22

    원하는 이벤트에 적합한 핸들러를 찾을 수 없습니다.

  23. 23

    요소가 페이지에있는 즉시 이벤트 핸들러를 HTML 요소에 첨부하는 방법이 있습니까?

  24. 24

    vuejs에서 부모와 자식 요소 사이에 클릭 이벤트 핸들러를 분리하는 방법

  25. 25

    JavaScript의 이벤트 핸들러는 이벤트 루프에서 어떻게 처리됩니까?

  26. 26

    CollectionViewSource.Filter 이벤트의 이벤트 핸들러에서 e와 item의 용도는 무엇입니까?

  27. 27

    jest에서 지연된 이벤트 핸들러를 테스트하는 방법은 무엇입니까?

  28. 28

    하나의 핸들러에서 여러 변경 이벤트를 처리하는 방법은 무엇입니까?

  29. 29

    typescript를위한 강력한 형식의 이벤트 패키지입니다. 이벤트에 바인딩 된 핸들러를 추가하는 방법

뜨겁다태그

보관