首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinRT调用Flyout.ShowAt()异步

WinRT调用Flyout.ShowAt()异步
EN

Stack Overflow用户
提问于 2015-08-10 20:47:30
回答 2查看 182关注 0票数 4

我正在构建我自己的Flyout控件与列表选择,以使用它的Windows以及Windows。与ListPickerFlyout类不同,飞离类没有异步方法来显示反演算。

我如何调用ShowAt方法异步,并返回所选的值后,飞出是关闭的?

解决方案:

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

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-11 10:34:19

WinRT XAML工具包有一个可使用UI的概念,这使得等待许多UI元素成为可能,而这些元素通常不应用awaitable逻辑。我还没在飞机上试过,但可能会成功的。

你可以找到它,这里

票数 2
EN

Stack Overflow用户

发布于 2015-08-11 00:07:34

与后端工作任务不同,ShowAt是一个UI交互。PickerFlyout类具有ShowAtAsync方法,但它不用于“等待”选择器的结果。

在XAML开发中,异步方法通常是为了避免UI阻塞。对于用户交互部分,我建议使用事件驱动模式。

在这种情况下,我建议在“关闭”事件处理程序中检索选择项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31928851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档