2013-04-23 17 views
8

Desidero modificare l'evidenziazione della sintassi di AvalonEdit nel mio codice.AvalonEdit Cambia sintassi Evidenziazione nel codice

XAML:

<avalonEdit:TextEditor Name="textEditor" SyntaxHighlighting="{Binding syntaxHighlighting}" /> 

C#:

public string syntaxHighlighting { get; set; } 

public MainWindow() 
{ 
    InitializeComponent(); 
    syntaxHighlighting = "C#"; 
    DataContext = this; 
} 

Ma l'evidenziazione della sintassi non è cambiato. Che cosa sto facendo di sbagliato? C'è una soluzione migliore per il mio problema?

risposta

5

Qui si va:

ICSharpCode.AvalonEdit.TextEditor textEditor = new ICSharpCode.AvalonEdit.TextEditor(); 
textEditor.ShowLineNumbers = true; 
string dir = @"C:\Program Files\MyFolder\"; 
#if DEBUG 
dir = @"C:\Dev\Sandbox\SharpDevelop-master\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Highlighting\Resources\"; 
#endif 

Stream xshd_stream = File.OpenRead(dir + "CSharp-Mode.xshd"); 
XmlTextReader xshd_reader = new XmlTextReader(xshd_stream); 
textEditor.SyntaxHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(xshd_reader, ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance); 
xshd_reader.Close(); 
xshd_stream.Close(); 

Edit:

Dal ICSharp.TextEditor getta AccessViolations in WinForms, io uso AvalonEdit in WinForms:

ElementHost host = new ElementHost(); 
host.Size = new Size(200, 100); 
host.Location = new Point(100, 100); 
host.Child = textEditor; 
this.Controls.Add(host); 
+1

Funziona, grazie. –

0

sintassiHighlighting non è una stringa! il tuo codice potrebbe non essere compilato! Nota che SyntaxHighlighting in XAML qui utilizza markup extensions, che crea un'istanza di SyntaxHighlighting, non una stringa.

private void OnTabLoaded(object sender, RoutedEventArgs e) 
{ 
    textEditor.SyntaxHighlighting = HighlightingLoader.Load(..., HighlightingManager.Instance); 
    textEditor.SyntaxHighlighting.MainRuleSet=... 
} 

Andare a sharpdevelop e scaricare il codice sorgente.

+0

Oh, lo vedo, mh sai come posso risolverlo? Posso modificare la sintassi quando ne ho solo il nome? –

+0

Faresti meglio a scaricare SharpDevelop fonte e a studiare sulla fonte, sarà di grande aiuto. – David

23
ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.GetDefinition("C#"); 
+1

'ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.GetDefinitionByExtension (Path.GetExtension (FileName));' –

1

Basta usare TypeConverter

var typeConverter = new HighlightingDefinitionTypeConverter(); 
var xmlSyntaxHighlighter = (IHighlightingDefinition)typeConverter.ConvertFrom("XML"); 
var csSyntaxHighlighter = (IHighlightingDefinition)typeConverter.ConvertFrom("C#"); 
CSharpEditor.SyntaxHighlighting = csSyntaxHighlighter; 
XmlEditor.SyntaxHighlighting = xmlSyntaxHighlighter; 
0

Se si desidera associare ad una stringa, è possibile definire un IValueConverter per avvolgere il costruito nel HighlightingDefinitionTypeConverter:

using System; 
using System.Globalization; 
using System.Windows.Data; 
using ICSharpCode.AvalonEdit.Highlighting; 

public class HighlightingDefinitionConverter : IValueConverter 
{ 
    private static readonly HighlightingDefinitionTypeConverter Converter = new HighlightingDefinitionTypeConverter(); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converter.ConvertFrom(value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converter.ConvertToString(value); 
    } 
} 

Poi, basta aggiungere il convertitore alla rilegatura:

<avalonEdit:TextEditor Name="textEditor" SyntaxHighlighting="{Binding syntaxHighlighting, Converter={StaticResource HighlightingDefinitionConverter}}" /> 
Problemi correlati