Xaml Windows phone 8.1弹出按钮隐藏行为问题

Xaml Windows phone 8.1弹出按钮隐藏行为问题,xaml,windows-phone-8.1,Xaml,Windows Phone 8.1,下面的行为xaml有什么问题,在运行时没有发生任何事情(甚至没有异常)。我试图在没有代码隐藏逻辑的情况下关闭弹出按钮 <AppBarButton HorizontalAlignment="Left" Label="Pin to dashboard" x:Name="pinBtn"> <AppBarButton.Flyout>

下面的行为xaml有什么问题,在运行时没有发生任何事情(甚至没有异常)。我试图在没有代码隐藏逻辑的情况下关闭弹出按钮

<AppBarButton HorizontalAlignment="Left"
                          Label="Pin to dashboard"
                          x:Name="pinBtn">
                <AppBarButton.Flyout>
                    <Flyout x:Name="flyout"
                            Placement="Full">
                        <StackPanel x:Name="stackPanel"
                                    HorizontalAlignment="Center"
                                    VerticalAlignment="Top">
                            <TextBlock Text="Save as"
                                       HorizontalAlignment="Center"
                                       FontSize="16" />
                            <TextBox Width="275"
                                     Style="{StaticResource RoundedTextBox}"
                                     FontFamily="Global User Interface" />
                            <StackPanel Orientation="Horizontal"
                                        HorizontalAlignment="Center">
                                <Button Content="Save"
                                        Width="50" />
                                <Button x:Name="button"
                                        Content="Cancel"
                                        Width="50"
                                        Margin="10,0,0,0">
                                     <Interactivity:Interaction.Behaviors>
                                        <Core:EventTriggerBehavior x:Name="eventTriggerBehavior" EventName="Click">
                                            <Core:CallMethodAction TargetObject="{Binding Flyout, ElementName=pinBtn}"
                                                                   MethodName="Hide" />
                                        </Core:EventTriggerBehavior>
                                    </Interactivity:Interaction.Behaviors>
                                </Button>
                            </StackPanel>
                        </StackPanel>
                    </Flyout>
                </AppBarButton.Flyout>
            </AppBarButton>

我确信您必须处理“代码隐藏”上的“保存”和“取消”按钮,所以为什么不关闭“代码隐藏”中的弹出按钮呢

<Button x:Name="buttonCancel"
     Content="Cancel" Width="50" Margin="10,0,0,0" 
     Click="buttonCancel_Click">


private void buttonCancel_Click(object sender, RoutedEventArgs e)
    {
        // Dismiss the Flyout after the action is confirmed.
        pinBtn.Flyout.Hide();
    }

私有无效按钮取消单击(对象发送者,路由目标)
{
//确认操作后,关闭弹出按钮。
pinBtn.Flyout.Hide();
}
我最近写了一篇关于如何通过自定义行为或动作来实现这一点的文章

单击该按钮时,您将希望在视觉树上漫游,直到找到FlyoutPresenter,然后将其父对象作为弹出窗口,并将IsOpen设置为false

var flyout = element.GetVisualParent<FlyoutPresenter>();
if (flyout != null)
{
    var popup = flyout.Parent as Popup;
    if (popup != null)
    {
        popup.IsOpen = false;
    }
}
var弹出按钮=element.GetVisualParent();
如果(弹出型按钮!=null)
{
var popup=弹出按钮。父项作为弹出按钮;
如果(弹出!=null)
{
popup.IsOpen=false;
}
}

我在WinRT XAML Toolkit的帮助下,通过自定义操作实现了它

/// <summary>
/// Using MVVM to close a flyout
/// </summary>
public class CloseFlyoutAction : DependencyObject, IAction
{
    /// <inheritdoc/>
    public object Execute(object sender, object parameter)
    {
        var element = sender as DependencyObject;
        var flyout = element.GetFirstAncestorOfType<FlyoutPresenter>();
        var popup = flyout.Parent as Popup;
        if (popup != null)
        {
            popup.IsOpen = false;
        }
        return null;
    }
}
//
///使用MVVM关闭弹出按钮
/// 
公共类CloseFlyoutAction:DependencyObject,IAction
{
/// 
公共对象执行(对象发送器、对象参数)
{
var元素=发送方作为DependencyObject;
var flyout=element.GetFirstAncestorOfType();
var popup=弹出按钮。父项作为弹出按钮;
如果(弹出!=null)
{
popup.IsOpen=false;
}
返回null;
}
}
用法:

<Button HorizontalAlignment="Right" Content="Cancel">
<interactivity:Interaction.Behaviors>
    <core:EventTriggerBehavior EventName="Tapped">
        <common:CloseFlyoutAction />
    </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>


您没有提到交互中的“核心”是什么:Interaction.Behaviors。你在用哪个图书馆。这可能是个问题。您可以使用TargetObject=“{Binding ElementName=flyout}”而不是TargetObject=“{Binding flyout,ElementName=pinBtn}”。您的名字也是小写的:x:name=“flyout”。我认为这很重要。但它无论如何都不起作用。因此,我在代码隐藏文件中使用Click=“…”按钮处理程序,因为他希望在不使用代码隐藏逻辑的情况下执行此操作。与此类似的是menull引用。在
var flyout=element.GetVisualParent()中,什么是
element
?这是作为
IAction
的一部分的框架元素。这篇博文将介绍更多细节