如何将ContextFlyout与ListView一起使用?

时间:2016-08-04 13:06:03

标签: c# uwp windows-10-universal

我正在尝试将MenuFlyout添加到我的UWP应用程序以支持控制器。问题是我无法弄清楚如何确定哪个ListViewItem实际触发了事件。

代码隐藏

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        this.DataContext = new List<String>{ "Item 1", "Item 2", "Item 3"};
    }

    private void ChoiceA_Click(object sender, RoutedEventArgs e)
    {
        // What was clicked?
    }
}

XAML

<ListView ItemsSource="{Binding}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="ContextFlyout">
                    <Setter.Value>
                        <MenuFlyout>
                            <MenuFlyoutItem Text="Choice A" Click="ChoiceA_Click" />
                            <MenuFlyoutItem Text="Choice B" />
                        </MenuFlyout>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

3 个答案:

答案 0 :(得分:1)

我刚刚使用本地计算机和移动模拟器测试了您的代码,您的ListView只能在PC上显示,只需点击OriginalSource,然后这是一个解决方案,您可以找到{{ 1}}在RightTapped ListView事件中,然后获取此DataContext的{​​{1}},例如:

OriginalSource

答案 1 :(得分:0)

试试这个解决方案。首先,您需要修改XAML,因为类ListViewItem没有属性ContextFlyout。你需要在ItemTemplate中使用FlyoutBase.AttachedFlyout。

<ListView ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" Tapped="TextBlock_Tapped">
                <FlyoutBase.AttachedFlyout>
                    <MenuFlyout>
                        <MenuFlyoutItem Text="{Binding}" IsHitTestVisible="False" FontWeight="Bold" FontSize="24" />
                        <MenuFlyoutItem Text="Choice A" Click="MenuFlyoutItem_Click" />
                        <MenuFlyoutItem Text="Choice B" />
                    </MenuFlyout>
                </FlyoutBase.AttachedFlyout>
            </TextBlock>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这里的代码隐藏:

公共密封部分类MainPage:Page     {         公共MainPage()         {             this.InitializeComponent();             this.DataContext = new List {“Item 1”,“Item 2”,“Item 3”};         }

    private async void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)
    {
        var fe = sender as FrameworkElement;
        var value = fe.DataContext.ToString();
        await new MessageDialog(value).ShowAsync();
    }

    private void TextBlock_Tapped(object sender, TappedRoutedEventArgs e)
    {
        var fe = sender as FrameworkElement;
        var menu = Flyout.GetAttachedFlyout(fe);
        menu.ShowAt(fe);
    }
}

您需要检测ListView中每个项目的ItemTapped事件,以便显示菜单。

答案 2 :(得分:0)

绑定到Opening的{​​{1}}事件。在事件处理程序中,MenuFlyoutsender本身。在那里,您会找到指向MenuFlyout的{​​{1}}属性。

根据您的示例,您的XAML可能如下所示:

Target

你的代码背后是这样的:

ListViewItem