UWP 将 MenuFlyout(Item) 动态添加到现有的 menuflyout
UWP add MenuFlyout(Item) dynamically to an existing menuflyout
我的 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
是根据用户数据生成的。
如何将代码生成的 Flyout
插入 Delete
上方 Shuffle
的正下方?
---更新---
这是我的 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>
您似乎有两个固定项目,Shuffle
和 Delete
。
您想在这两个项目之间插入新生成的 MenuFlyout 项目。试试这个代码:
var newFlyout = GetAddToPlaylistFlyout();
foreach(var item in newFlyout.Items)
{
AlbumFlyout.Items.Insert(AlbumFlyout.Items.Count - 1, item);
}
顺便说一句,如果你的AlbumFlyout
在DataTemplate
中,可能在Code-behind中不可用,你可以尝试把它放在Page.Resources
中,然后引用它StaticResource
.
此致。
我的 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
是根据用户数据生成的。
如何将代码生成的 Flyout
插入 Delete
上方 Shuffle
的正下方?
---更新---
这是我的 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>
您似乎有两个固定项目,Shuffle
和 Delete
。
您想在这两个项目之间插入新生成的 MenuFlyout 项目。试试这个代码:
var newFlyout = GetAddToPlaylistFlyout();
foreach(var item in newFlyout.Items)
{
AlbumFlyout.Items.Insert(AlbumFlyout.Items.Count - 1, item);
}
顺便说一句,如果你的AlbumFlyout
在DataTemplate
中,可能在Code-behind中不可用,你可以尝试把它放在Page.Resources
中,然后引用它StaticResource
.
此致。