gpt4 book ai didi

c# - WinRT 异步调用 Flyout.ShowAt()

转载 作者:太空狗 更新时间:2023-10-30 01:34:06 25 4
gpt4 key购买 nike

我正在构建自己的 Flyout控制列表选择以在 Windows Phone 和 Windows 桌面上使用它。不像ListPickerFlyout类,Flyout类没有显示弹出窗口的异步方法。

如何调用 ShowAt方法异步并在弹出窗口关闭后返回所选值?


解决方法:

异步行为可以通过 TaskCompletionSource<T> 实现(感谢 AwaitableUI libary )。仍然困扰我的是我必须在构造函数中手动创建 ListView。如果我可以改用 XAML 并只分配一个模板,那就太好了,但我没有找到可行的方法。

public class ListPickerFlyout<T> : Flyout where T : class
{
private event EventHandler<object> ItemPicked;

public ListPickerFlyout(IEnumerable<T> items)
{
Placement = FlyoutPlacementMode.Full;
Opening += OnOpening;
Closed += OnClosed;

var listView = new ListView();
listView.SelectionMode = ListViewSelectionMode.None;
listView.IsItemClickEnabled = true;
listView.ItemClick += OnItemClick;
listView.DisplayMemberPath = "Name";
listView.SetBinding(ListView.ItemsSourceProperty, new Binding { Source = items });

Content = listView;
}

public async Task<T> ShowAsync()
{
this.ShowAt(Window.Current.Content as Frame);

var tcs = new TaskCompletionSource<T>();

EventHandler<object> eventHandler = null;

eventHandler = (s, e) =>
{
this.Closed -= eventHandler;
this.ItemPicked -= eventHandler;

tcs.SetResult(e as T);
};

this.Closed += eventHandler;
this.ItemPicked += eventHandler;

return await tcs.Task;
}

private void OnItemClick(object sender, ItemClickEventArgs e)
{
var selectedItem = e.ClickedItem as T;

var eventHandler = ItemPicked;
if (eventHandler != null)
eventHandler(this, selectedItem);

this.Hide();
}

private void OnOpening(object sender, object e)
{
var frame = Window.Current.Content as Frame;
var page = frame.Content as Page;

if (page != null)
page.BottomAppBar.Visibility = Visibility.Collapsed;
}

private void OnClosed(object sender, object e)
{
var frame = Window.Current.Content as Frame;
var page = frame.Content as Page;

if (page != null)
page.BottomAppBar.Visibility = Visibility.Visible;
}
}

最佳答案

WinRT XAML 工具包具有可等待 UI 的概念,这使得等待许多通常不应用可等待逻辑的 UI 元素成为可能。我还没有在 Flyout 上尝试过,但它可能会起作用。

你可以找到它here

关于c# - WinRT 异步调用 Flyout.ShowAt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com