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(); }