我需要设置我的 MenuFlyout
程式化的方式。然而,我注意到,在我的函数中添加了异步代码后,函数的 MenuFlyout
除非我第二次右击该项目,否则不会显示其项目。我怎样才能设置我的 MenuFlyout
的异步方式?
private async void MenuFlyout_Opened(object sender, object e)
{
var flyout = sender as MenuFlyout;
Music music = flyout.Target.DataContext as Music;
if (await Helper.FileNotExist(music.Path))
{
if (Removable)
{
flyout.Items.Clear();
flyout.Items.Add(MenuFlyoutHelper.GetRemovableMenuFlyoutItem(music, this));
}
else
{
Helper.ShowAddMusicResultNotification(music.Name);
}
return;
}
if (Removable) MenuFlyoutHelper.SetRemovableMusicMenu(sender, this);
else MenuFlyoutHelper.SetMusicMenu(sender, this);
if (AllowReorder)
{
var item = new MenuFlyoutItem()
{
Text = Helper.Localize("Move To Top"),
Icon = new SymbolIcon(Symbol.Upload)
};
item.Click += (s, args) =>
{
MediaHelper.MoveMusic(music.Index, 0);
};
flyout.Items.Add(item);
}
}
一种方法是避免在此类函数中使用异步代码,并检查文件是否在 Click
物品的事件。但我有太多的项目。我认为这是个坏主意。
这段代码可以正常工作。
private void OpenMusicMenuFlyout(object sender, object e)
{
if (Removable) MenuFlyoutHelper.SetRemovableMusicMenu(sender, this);
else MenuFlyoutHelper.SetMusicMenu(sender, this);
if (AllowReorder)
{
var flyout = sender as MenuFlyout;
var item = new MenuFlyoutItem()
{
Text = Helper.Localize("Move To Top"),
Icon = new SymbolIcon(Symbol.Upload)
};
item.Click += (s, args) =>
{
Music music = (s as MenuFlyoutItem).DataContext as Music;
MediaHelper.MoveMusic(music.Index, 0);
};
flyout.Items.Add(item);
}
}
这段代码 Dispatcher.RunAsync
:
private async void OpenMusicMenuFlyout(object sender, object e)
{
var flyout = sender as MenuFlyout;
Music music = flyout.Target.DataContext as Music;
if (await Helper.FileNotExist(music.Path))
{
if (Removable)
{
flyout.Items.Clear();
flyout.Items.Add(MenuFlyoutHelper.GetRemovableMenuFlyoutItem(music, this));
}
else
{
Helper.ShowAddMusicResultNotification(music.Name);
}
return;
}
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
{
if (Removable) MenuFlyoutHelper.SetRemovableMusicMenu(sender, this);
else MenuFlyoutHelper.SetMusicMenu(sender, this);
if (AllowReorder)
{
var item = new MenuFlyoutItem()
{
Text = Helper.Localize("Move To Top"),
Icon = new SymbolIcon(Symbol.Upload)
};
item.Click += (s, args) =>
{
MediaHelper.MoveMusic(music.Index, 0);
};
flyout.Items.Add(item);
}
});
}
很好的问题,为了测试,如果我们在上面的函数中调用异步函数 OpenMusicMenuFlyout
事件处理程序。 MenuFlyout
添加操作会被中断,UI渲染也会被取消。对于上述情况,比较好的方法是让它成为 Flyout
作为 ContextFlyout
内容就用 ListView
取代 MenuFlyout
. 更多内容请查看以下内容。
<SwipeControl>
<SwipeControl.ContextFlyout>
<Flyout Opening="OpenMusicMenuFlyout">
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Flyout>
</SwipeControl.ContextFlyout>
</SwipeControl>
代码背后
private async void OpenMusicMenuFlyout(object sender, object e)
{
var items = new ObservableCollection<string>() { "One", "Two", "Three" };
var flyout = sender as Flyout;
var menu = flyout.Content as ItemsControl;
await TestMetod();
menu.ItemsSource = items;
}