2013-12-16 3 views
3

VS 2013 및 MVVM Light를 사용하여 Windows 8.1 앱을 개발 중입니다. 유형 Microsoft.Xaml.Interactions.Core.EventTriggerBehavior의 인스턴스를 추가 할 수 없습니다 :Windows 8.1 : 플라이 아웃 동작이 작동하지 않습니다.

WinRT-정보을 : 응용 프로그램을 컴파일하는 동안

<AppBarButton.Flyout> 
    <Flyout x:Name="FlyoutCalculator" 
      Placement="Top" 
      FlyoutPresenterStyle="{StaticResource FlyoutPresenterBaseStyle}"> 

     <uc:Calculator ApplyCommand="{Binding CancelCommand}" 
         CancelCommand="{Binding CancelCommand}"           
         Available="{Binding AvailableCounter, Mode=OneWay}" 
         SelectedItem="{Binding SelectedItem, Mode=TwoWay}"/> 
     <interactivity:Interaction.Behaviors> 
      <core:EventTriggerBehavior EventName="Opening"> 
       <core:InvokeCommandAction Command="{Binding ShowCurrentCostsCommand}" /> 
      </core:EventTriggerBehavior> 
     </interactivity:Interaction.Behaviors> 
    </Flyout> 
</AppBarButton.Flyout> 

불행하게도 나는 예외를 얻을 :

다음 코드는 appbar 내에서 플라이 아웃의 동작을 보여줍니다 컬렉션 유형으로 Microsoft.Xaml.Interactivity.BehaviorCollection

보기의 다른 동작은 작동합니까? 나에게 이것에 대한 해결책을 안다?

+0

검색 엔진이 날 여기을 제공합니다. 나도 같은 문제를 만났습니다! – SimonFisher

답변

1

해결책이 없지만 : 필자는 Windows 8.1 응용 프로그램에서 플라이 아웃을 사용하지 않고 사용자 컨트롤을 사용하여 EventTriggerBehavior을 추가했습니다. 그리고 런타임시 VisualStudio에서 똑같은 Errormessage를 얻습니다. 나는 RoutedEventHandler을 사용하고로서 당신이 행동에 대한 트리거로

EventHandler<object> Opening 

를 사용할 때이 문제가 발생할 수 있습니다. 그러나 이것은 단지 문제의 원인 일뿐입니다.

은 나를 위해 내가 대답을 발견했다 :

난 그냥 보통의 EventHandler로 내 RoutedEventHandler의 유형을 변경했습니다. 그리고 으로 RoutedEventArgs을 변환하는 방법을 모르기 때문에 RoutedEventHandler을 트리거하는 CodeBehind 내부의 메서드가 호출자와 함께 호출됩니다.하지만 EventArgs가 필요하지 않은 한 문제는 아닙니다.

플라이 아웃 컨트롤이있는 UserControl을 만들고이를 사용하는 페이지에 공개 이벤트를 공개로 설정하여 문제를 해결할 수도 있습니다. 그런 다음 EventTriggerBehavior을 UserControl에 추가하고 사용자 지정 Opening 이벤트에 연결하면 예상되는 동작을 얻게됩니다.

1

매우 늦게 대답하지만이 문제를 발견하고 해결책을 찾아 냈습니다.

플라이 아웃 전용 맞춤 동작을 만들었습니다. 이렇게 사용했습니다. 플라이 아웃이 열릴 때 OpenActions이 실행되고 플라이 아웃이 닫히면 CloseActions이 실행됩니다. 이 경우 플라이 아웃을 열었을 때 맨 아래의 앱 표시 줄이 보이지 않기를 바랬습니다.

<Flyout Placement="Full"> 
    <i:Interaction.Behaviors> 
    <behaviors:FlyoutBehavior> 
     <behaviors:FlyoutBehavior.OpenActions> 
     <core:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" TargetObject="{Binding ElementName=CommandBar}" /> 
     </behaviors:FlyoutBehavior.OpenActions> 
     <behaviors:FlyoutBehavior.CloseActions> 
     <core:ChangePropertyAction PropertyName="Visibility" Value="Visible" TargetObject="{Binding ElementName=CommandBar}" /> 
     </behaviors:FlyoutBehavior.CloseActions> 
    </behaviors:FlyoutBehavior> 
    </i:Interaction.Behaviors> 
    <Grid> 
    ... 
    </Grid> 
</Flyout> 

코드는 여기에 있습니다 :

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

    public void Attach(Windows.UI.Xaml.DependencyObject associatedObject) 
    { 
     var flyout = associatedObject as FlyoutBase; 

     if (flyout == null) 
      throw new ArgumentException("FlyoutBehavior can be attached only to FlyoutBase"); 

     AssociatedObject = associatedObject; 

     flyout.Opened += FlyoutOpened; 
     flyout.Closed += FlyoutClosed; 
    } 

    public void Detach() 
    { 
     var flyout = AssociatedObject as FlyoutBase; 

     if (flyout != null) 
     { 
      flyout.Opened -= FlyoutOpened; 
      flyout.Closed -= FlyoutClosed; 
     } 
    } 

    public static readonly DependencyProperty OpenActionsProperty = 
     DependencyProperty.Register("OpenActions", typeof(ActionCollection), typeof(FlyoutBehavior), new PropertyMetadata(null)); 

    public ActionCollection OpenActions 
    { 
     get { return GetValue(OpenActionsProperty) as ActionCollection; } 
     set { SetValue(OpenActionsProperty, value); } 
    } 

    public static readonly DependencyProperty CloseActionsProperty = 
     DependencyProperty.Register("CloseActions", typeof(ActionCollection), typeof(FlyoutBehavior), new PropertyMetadata(null)); 

    public ActionCollection CloseActions 
    { 
     get { return GetValue(CloseActionsProperty) as ActionCollection; } 
     set { SetValue(CloseActionsProperty, value); } 
    } 

    private void FlyoutOpened(object sender, object e) 
    { 
     foreach (IAction action in OpenActions) 
     { 
      action.Execute(AssociatedObject, null); 
     } 
    } 

    private void FlyoutClosed(object sender, object e) 
    { 
     foreach (IAction action in CloseActions) 
     { 
      action.Execute(AssociatedObject, null); 
     } 
    } 

    public FlyoutBehavior() 
    { 
     OpenActions = new ActionCollection(); 
     CloseActions = new ActionCollection(); 
    } 
} 
관련 문제