【问题标题】:Windows phone 8.1 Flyout hide with behaviour issueWindows phone 8.1 Flyout 隐藏行为问题
【发布时间】:2023-07-11 21:15:01
【问题描述】:

以下行为 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>

【问题讨论】:

  • 你在Interactivity:Interaction.Behaviors中没有提到什么是“核心”。您正在使用哪个库。可能是个问题。
  • 您可以使用 TargetObject="{Binding ElementName=flyout}" 而不是 TargetObject="{Binding Flyout, ElementName=pinBtn}"。你的名字也是小写的:x:Name="flyout"。我认为这很重要。但无论如何它都不起作用。所以我在文件后面的代码中使用 Click="..." 按钮处理程序

标签: xaml windows-phone-8.1


【解决方案1】:

我最近写了a blog post,介绍了如何通过自定义行为或操作来实现这一点。

当按钮被点击时,你会想要沿着可视化树向上走,直到找到 FlyoutPresenter,然后弹出它的 Parent 并将 IsOpen 设置为 false;

var flyout = element.GetVisualParent<FlyoutPresenter>();
if (flyout != null)
{
    var popup = flyout.Parent as Popup;
    if (popup != null)
    {
        popup.IsOpen = false;
    }
}

【讨论】:

  • var flyout = element.GetVisualParent&lt;FlyoutPresenter&gt;(); 中的element 是什么?
  • 这是作为IAction 一部分的FrameworkElement。这篇博文详细介绍了
【解决方案2】:

在 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;
    }
}

用法:

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

【讨论】:

    【解决方案3】:

    我确信您必须处理代码后面的保存和取消按钮,所以为什么不关闭代码后面的弹出窗口。

    <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();
        }
    

    【讨论】:

    • 因为他想在没有逻辑背后的代码的情况下做到这一点。像我一样
    • 空引用这个。