/// <summary> /// Hide info pop-up or cancel the task if it wasn't finished yet (prevent pop-up showing). /// </summary> private void HideInfoPopup() { showInfoPopupTaskToken?.Cancel(); showInfoPopupTaskToken?.Dispose(); showInfoPopupTaskToken = null; infoPopupWindow?.Close(); infoPopupWindow = null; }
/// <summary> /// Show info pop-up and position it. /// </summary> private async void ShowInfoPopup(DataGridClause clause) { Rect workArea = ScreenInfo.GetRectInDpi(this, ScreenInfo.GetScreenFrom(this).WorkingAreaPix); var popup = new InfoPopup(clause) { Owner = this }; //Calculate shifts to position the pop-up relative to the main window and its screen double addX = (WindowState == WindowState.Normal) ? Left + SystemParameters.WindowResizeBorderThickness.Left + SystemParameters.WindowNonClientFrameThickness.Left : workArea.Left; double addY = (WindowState == WindowState.Normal) ? Top + SystemParameters.WindowResizeBorderThickness.Top + SystemParameters.WindowNonClientFrameThickness.Top : workArea.Top + SystemParameters.WindowCaptionHeight; popup.Show(); //Here, to get actual window size //Position the window popup.Left = Mouse.GetPosition(this).X - popup.Width / 2 + addX; popup.Top = Mouse.GetPosition(this).Y - popup.Height + 5 + addY; //Handling of falling the window out of bounds of the screen if (popup.Left < workArea.Left) { popup.Left = workArea.Left; } else if ((popup.Left + popup.Width) > workArea.Right) { popup.Left = workArea.Right - popup.Width; } if (popup.Top < workArea.Top) { popup.Top = workArea.Top; } else if ((popup.Top + popup.Height) > workArea.Bottom) { popup.Top = workArea.Bottom - popup.Height; } infoPopupWindow = popup; //To make it thread safe if (PrgSettings.Default.AutoplaySound && !String.IsNullOrEmpty(clause.Sound)) { try { await SoundManager.PlaySoundAsync(clause.Id, clause.Sound, dbFacade.DataSource); } catch (FileNotFoundException) { } } //Update clause's watch data if (clause.Watched.Date == DateTime.Now.Date) { return; //Increment only once a day } await dbFacade.UpdateClauseWatchAsync(clause.Id); DataGridClause updated = (await dbFacade.GetClauseByIdAsync(clause.Id)).MapToDataGridClause(); clause.Watched = updated.Watched; clause.WatchedCount = updated.WatchedCount; mainDataGrid.Items.Refresh(); }