Белые линии вместо слов в CompletionWindow (пространство имен CodeCompletion), когда AvalonEdit используется из F#
Я использую библиотеку AvalonEdit C# из кода F# и выполняю завершение кода. Кажется, все работает, как и ожидалось, окно завершения кода отображается, всплывающие подсказки в отдельных строках отображаются правильно, выбранные слова вставляются в документ. Единственная проблема заключается в том, что все строки в окне завершения являются пустыми, как будто они ничего не содержат.
Выполнение кода в Visual Studion 2013 здесь не совсем удобно, потому что оно неожиданно влияет на поведение окна завершения, которое отличается от того, когда точки останова не используются.
Вот данные MyCompletionData, взятые из справки AvalonEdit и переписанные в F#:
module CompletionData
open ICSharpCode.AvalonEdit.CodeCompletion
open System
open System.Windows.Media.Imaging
/// Implements AvalonEdit ICompletionData interface to provide the entries in the
/// completion drop down.
type MyCompletionData (text:string) =
let _text = text
interface ICompletionData with
member this.Complete (textArea, completionSegment, insertionRequestEventArgs) =
textArea.Document.Replace(completionSegment, ((this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text: string));
// Use this property if you want to show a fancy UIElement in the list.
member this.Content
with get () = (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text :> obj
member this.Description
with get () = ("Description for " + (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text ) :> obj
member this.Image
with get () = null
member this.Priority
with get () = 1.0
member this.Text = _text
1 ответ
Это можно решить, как описано здесь: /questions/5783600/svyazyivanie-dannyih-s-f-viewmodel
Самый прямой обходной путь - определить его как явное свойство (а реализация интерфейса может просто ссылаться на основное свойство).
type MyCompletionData (text:string) =
let _text = text
member this.Text = text
member this.Complete (textArea:TextArea, completionSegment, insertionRequestEventArgs) =
textArea.Document.Replace(completionSegment, ((this :> ICSharpCode..CodeCompletion.ICompletionData).Text: string));
member this.Content = (this :> ICSharpCode..CodeCompletion.ICompletionData).Text :> obj
member this.Description = ("Description for " + (this :> ICSharpCode..CodeCompletion.ICompletionData).Text ) :> obj
member this.Image = null
member this.Priority = 1.0
interface ICompletionData with
member this.Complete (textArea, completionSegment, insertionRequestEventArgs) =
this.Complete (textArea, completionSegment, insertionRequestEventArgs)
// Use this property if you want to show a fancy UIElement in the list.
member this.Content = this.Content
member this.Description = this.Description
member this.Image = this.Image
member this.Priority = this.Priority
member this.Text = this.Text