UWP动态向现有菜单中添加MenuFlyout(Item)

3

我在我的DataTemplate中有一个Grid,目前它有这个Flyout

                    <Grid.ContextFlyout>
                        <MenuFlyout x:Name="AlbumFlyout">
                            <MenuFlyoutItem Icon="Shuffle" Text="Shuffle" />
                            <MenuFlyoutItem Icon="Delete" Text="Delete" />
                        </MenuFlyout>
                    </Grid.ContextFlyout>

我还有一个动态生成的Flyout

    public static MenuFlyout GetAddToPlaylistFlyout()
    {
        MenuFlyout flyout = new MenuFlyout();
        flyout.Items.Add(new MenuFlyoutItem()
        {
            Icon = new FontIcon() { Glyph = "\uEC4F" },
            Text = "Now Playing"
        });
        flyout.Items.Add(new MenuFlyoutSeparator());
        flyout.Items.Add(new MenuFlyoutItem()
        {
            Icon = new SymbolIcon(Symbol.Add),
            Text = "New Playlist"
        });
        foreach (var playlist in Settings.settings.Playlists)
        {
            var item = new MenuFlyoutItem()
            {
                Icon = new SymbolIcon(Symbol.Audio),
                Text = playlist.Name
            };
            flyout.Items.Add(item);
        }
        return flyout;
    }

这是动态生成的,因为我需要经常重复使用它,其中一些MenuFlyoutItem是从用户数据生成的。

我该如何在Shuffle上方、Delete下方插入代码生成的Flyout

---更新---

这是我的ListView定义的一部分。

<ListView
    x:Name="SongsListView"
    Grid.Row="1"
    AllowDrop="True"
    CanDrag="True"
    CanReorderItems="True"
    ContainerContentChanging="SongsListView_ContainerContentChanging"
    IsItemClickEnabled="True"
    ItemClick="SongsListView_ItemClick"
    ItemsSource="{Binding Songs, Mode=TwoWay}"
    ReorderMode="Enabled"
    SelectionMode="None">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="ContextFlyout" Value="{StaticResource ListViewItemContextFlyout}" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>
1个回答

3

看起来你有两个固定项,ShuffleDelete

你想在这两个项之间插入新生成的MenuFlyout项。尝试使用以下代码:

var newFlyout = GetAddToPlaylistFlyout();
foreach(var item in newFlyout.Items)
{
    AlbumFlyout.Items.Insert(AlbumFlyout.Items.Count - 1, item);
}

顺便提一下,如果你的AlbumFlyoutDataTemplate中,并且可能无法在Code-behind中使用,可以尝试将其放在Page.Resources中,然后使用StaticResource引用它。

最好的问候。


1
不需要将DataTemplate放在资源中,但是如果您的MenuFlyout是DataTemplate的子级,则可以考虑将MenuFlyout放在资源中以便获取它。 - Richard Zhang
我现在已经将 MenuFlyout 放入 Resource 中,并使用 ListView.ItemContainerStyle 分配了 MenuFlyout,但现在我又遇到了另一个问题。我曾经可以通过 (sender as MenuFlyoutItem).DataContext 访问绑定到 DataTemplate 的数据。现在它返回 null。我该如何获取数据? - Seaky Lone
是的,这就是我所做的:<Setter Property="ContextFlyout" Value="{StaticResource ListViewItemContextFlyout}" /> 但我仍然得到null。我将其放在ListView.ItemContainerStyle的样式中。 - Seaky Lone
我也有一个相关问题。例如,我的DataTemplateGrid作为其内容。那么,我应该将MenuFlyout注册到Grid.ContextFlyout中吗?但是这样做的问题是右键单击只有在我点击ListViewItem上的UI元素时才会触发flyout。将其添加到ListView.ItemContainerStyle可以使其在任何地方都起作用。 - Seaky Lone
1
当右键单击实际元素(如TextBlock)时,是否会出现MenuFlyout?如果是这样,问题在于您在透明背景上没有为Grid设置背景,这意味着当您右键单击空白处时,指针实际上穿过了Grid,并且没有实际的触发器,您可以尝试给Grid设置背景并观察触发器。 - Richard Zhang
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接