3

我正在使用 VS 2013 和 MVVM Light 开发一个 Windows 8.1 应用程序。

以下代码显示了 appbar 内的浮出控件中的行为:

<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>

不幸的是,我在编译应用程序时遇到了异常:

WinRT-Informationen:无法将类型的实例添加到类型Microsoft.Xaml.Interactions.Core.EventTriggerBehavior的集合中Microsoft.Xaml.Interactivity.BehaviorCollection

视图中的其他行为确实有效,有人知道解决方案吗?

4

2 回答 2

1

我没有解决方案,但是:我没有在我的 Windows 8.1 应用程序中使用 Flyouts,我使用的是EventTriggerBehavior像你一样添加了一个 UserControl。我在运行时从 VisualStudio 得到完全相同的错误消息。当我使用时,RoutedEventHandler这可能会导致您使用时出现问题

EventHandler<object> Opening

作为行为的触发器。但这只是问题所在的一个想法。

对我来说,我找到了答案:

我已将我的类型更改为RoutedEventHandler普通的EventHandler。CodeBehind 中触发 的方法RoutedEventHandler仅由发送方调用,因为我不知道如何转换RoutedEventArgsEventArgs,但只要我不需要 EventArgs 就不是问题。

您还可以通过使用弹出控件创建用户控件并将打开事件公开到您使用它的页面来解决问题。然后你可以添加EventTriggerBehavior到 UserControl 并将它连接到你的自定义Opening事件,你应该得到预期的行为。

于 2013-12-17T15:51:48.970 回答
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();
    }
}
于 2015-02-07T02:57:37.527 回答