예제 #1
0
파일: BPopupBase.cs 프로젝트: xlgwr/Blazui
        internal async Task CloseSubMenuAsync(SubMenuOption option)
        {
            await option.SubMenu.TopMenu.SemaphoreSlim.WaitAsync();

            try
            {
                if (!option.IsShow)
                {
                    return;
                }
                option.IsShow = false;
                if (GlobalBlazuiSettings.DisableAnimation)
                {
                    await InvokeAsync(option.SubMenu.DeActivate);

                    PopupService.SubMenuOptions.Remove(option);
                    return;
                }
                await InvokeAsync(StateHasChanged);

                await Task.Delay(200);
                await InvokeAsync(option.SubMenu.DeActivate);

                PopupService.SubMenuOptions.Remove(option);
            }
            finally
            {
                option.SubMenu.TopMenu.SemaphoreSlim.Release();
            }
        }
예제 #2
0
        protected async Task OnOverAsync()
        {
            if (TopMenu.Mode == MenuMode.Horizontal)
            {
                await SemaphoreSlim.WaitAsync();

                try
                {
                    if (IsOpened)
                    {
                        try
                        {
                            if (subMenuOption != null &&
                                subMenuOption.ClosingTask != null &&
                                subMenuOption.ClosingTask.Status != TaskStatus.RanToCompletion &&
                                subMenuOption.ClosingTask.Status != TaskStatus.Canceled)
                            {
                                subMenuOption.ClosingTaskCancellationTokenSource.Cancel();
                            }
                        }
                        catch (ObjectDisposedException)
                        {
                        }
                        return;
                    }
                    subMenuOption = new SubMenuOption()
                    {
                        SubMenu = this,
                        Content = ChildContent,
                        Options = Options,
                        Target  = Element
                    };
                    var taskCompletionSource = new TaskCompletionSource <int>();
                    subMenuOption.TaskCompletionSource = taskCompletionSource;
                    while (PopupService.SubMenuOptions.Any())
                    {
                        await Task.Delay(50);
                    }
                    PopupService.SubMenuOptions.Add(subMenuOption);
                    IsOpened = true;
                }
                finally
                {
                    SemaphoreSlim.Release();
                }
                await subMenuOption.TaskCompletionSource.Task;
                borderColor = "transparent";

                IsOpened = false;
                await OnOutAsync();
            }
            else
            {
                backgroundColor = Options.HoverColor;
                textColor       = Options.ActiveTextColor;
                isActive        = true;
            }
        }
예제 #3
0
        internal async Task CloseSubMenuAsync(SubMenuOption option)
        {
            option.IsShow = false;
            //option.HideStatus = AnimationStatus.Begin;
            StateHasChanged();
            await Task.Delay(200);

            //option.HideStatus = AnimationStatus.End;
            //StateHasChanged();
            //await Task.Delay(200);
            PopupService.SubMenuOptions.Remove(option);
            option.TaskCompletionSource.TrySetResult(0);
        }
예제 #4
0
        internal async Task ReadyCloseSubMenuAsync(SubMenuOption option)
        {
            option.ClosingTaskCancellationTokenSource = new System.Threading.CancellationTokenSource();
            var task = Task.Delay(200, option.ClosingTaskCancellationTokenSource.Token).ContinueWith(async task =>
            {
                if (task.IsCanceled)
                {
                    DisposeTokenSource(option.ClosingTaskCancellationTokenSource);
                    return;
                }
                DisposeTokenSource(option.ClosingTaskCancellationTokenSource);
                await CloseSubMenuAsync(option);
            });

            option.ClosingTask = await task;
        }
예제 #5
0
 internal void ReadyCloseSubMenu(SubMenuOption option)
 {
     if (option.CancelClose)
     {
         option.CancelClose = false;
         return;
     }
     option.Closing = true;
     Task.Delay(500).ContinueWith(task =>
     {
         if (!option.Closing)
         {
             return;
         }
         _ = CloseSubMenuAsync(option);
     });
 }
예제 #6
0
        protected async Task OnOverAsync()
        {
            if (TopMenu.Mode == MenuMode.Horizontal)
            {
                if (isOpened && subMenuOption.Closing)
                {
                    subMenuOption.Closing = false;
                    return;
                }
                var taskCompletionSource = new TaskCompletionSource <int>();
                subMenuOption = new SubMenuOption()
                {
                    SubMenu = this,
                    Content = ChildContent,
                    Options = Options,
                    Target  = Element,
                    Closing = false,
                    TaskCompletionSource = taskCompletionSource
                };
                var prevMenuOption = PopupService.SubMenuOptions.FirstOrDefault();
                if (prevMenuOption != null)
                {
                    await prevMenuOption.Close(prevMenuOption);
                }
                PopupService.SubMenuOptions.Add(subMenuOption);
                isOpened = true;
                await taskCompletionSource.Task;
                borderColor = "transparent";

                isOpened = false;
                OnOut();
            }
            else
            {
                backgroundColor = Options.HoverColor;
                textColor       = Options.ActiveTextColor;
                isActive        = true;
            }
            //opened = true;
        }
예제 #7
0
 internal void ShowSubMenu(SubMenuOption option)
 {
     option.Closing = false;
 }
예제 #8
0
 internal void KeepShowSubMenu(SubMenuOption option)
 {
     CancelTokenSource(option.ClosingTaskCancellationTokenSource);
 }