private void OnUnloaded(object sender, RoutedEventArgs e)
        {
            ViewModel.DocumentChanged -= OnViewModelDocumentChanged;

            CodeEditorToolTip.IsOpen = false;
            CompletionListFlyout.Hide();
        }
 private async void OnCodeEditorCharacterReceived(UIElement sender, CharacterReceivedRoutedEventArgs e)
 {
     if (e.Character == '.' || IsValidCSharpIdentifierCharacter(e.Character))
     {
         await ShowCompletionListAsync();
     }
     else
     {
         CompletionListFlyout.Hide();
     }
 }
        private async Task ShowCompletionListAsync()
        {
            if (ViewModel.CodeEditor is null)
            {
                return;
            }

            ITextRange range = CodeEditor.Document.Selection;

            if (range.Length < 0)
            {
                range.EndPosition = range.StartPosition;
            }
            else
            {
                range.StartPosition = range.EndPosition;
            }

            TextSpan selectionSpan = GetAdjustedTextSpan(TextSpan.FromBounds(range.StartPosition, range.EndPosition), ViewModel.CurrentText, ViewModel.NewLineMode, true);

            CompletionList?completionList = await ViewModel.GetCompletionListAsync(selectionSpan.Start);

            if (completionList != null)
            {
                bool expandsToWord = true;

                ITextRange wordRange = range.GetClone();

                if (wordRange.Character == '\r')
                {
                    ITextRange wordRangeClone = range.GetClone();
                    wordRangeClone.Move(TextRangeUnit.Word, -1);

                    expandsToWord = IsValidCSharpIdentifierCharacter(wordRangeClone.Character);
                }

                if (expandsToWord)
                {
                    wordRange.Move(TextRangeUnit.Word, -1);
                    wordRange.MoveEnd(TextRangeUnit.Word, 1);
                }

                string word = wordRange.Text.Trim();

                var completionItems = ViewModel.FilterCompletionItems(completionList.Items, word);

                CompletionListFlyout.Items.Clear();

                foreach (CompletionItem item in completionItems)
                {
                    var properties = item.Properties;

                    if (properties.TryGetValue("SymbolName", out string symbolName))
                    {
                        MenuFlyoutItem menuFlyoutItem = new MenuFlyoutItem
                        {
                            Text = symbolName
                        };

                        menuFlyoutItem.Click += async(s, e) =>
                        {
                            CompletionChange?completionChange = await ViewModel.GetCompletionChangeAsync(item);

                            if (completionChange != null)
                            {
                                TextSpan span = GetAdjustedTextSpan(completionChange.TextChange.Span, ViewModel.CurrentText, ViewModel.NewLineMode);

                                CodeEditor.Document.Selection.StartPosition = span.Start;
                                CodeEditor.Document.Selection.EndPosition   = span.End;

                                CodeEditor.Document.Selection.TypeText(completionChange.TextChange.NewText);
                            }
                        };

                        CompletionListFlyout.Items.Add(menuFlyoutItem);
                    }
                }

                if (CompletionListFlyout.Items.Count > 0)
                {
                    Point flyoutPosition = GetAdjustedPointFromDocument(range);
                    flyoutPosition = new Point(flyoutPosition.X + 12, flyoutPosition.Y + 8);

                    CompletionListFlyout.ShowAt(CodeEditor, new FlyoutShowOptions {
                        Position = flyoutPosition, ShowMode = FlyoutShowMode.Transient
                    });
                    return;
                }
            }

            CompletionListFlyout.Hide();
        }