WPF-Alternative zur FastColoredTextbox

  • WPF

Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    WPF-Alternative zur FastColoredTextbox

    Hallo,

    da ich langsam mal mit der WPF anfangen möchte, und meine übungsprojekte meist eine art Snippet-Datenbank werden, wollte ich mal fragen ob euch bereits eine WPF-Version der FastColoredTextBox bekannt ist.
    Für alle die diese noch nicht kennen, es handelt sich hierbei um ein TextboxControl, welches Text farblich markiert darstellt, quasi wie text den wir hier im Forum in die VB.net-Klammern packen.

    Als Besipiel ein Screenshot meiner aktuellen Snippetbase im Anhang.



    LG
    Bilder
    • SNB.JPG

      240,43 kB, 1.751×1.162, 58 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo

    Es ist mir noch nichts der gleichen unter gekommen, ist aber recht leicht zu machen. Vorallem weil es ja die RichtTextBox von Xceed im WPF Toolkit gibt und die unterstützt Formatter.

    Ich gab vor kurzen auch einen Beitrag dazu wo ich einen eigenen Formatter für diese RTB gebaut hatte.
    Musst du ein wenig Scrollen, da habe ich auch ein Beispiel hochgeladen welcher rudimentär zeigt wie dieser Formatter arbeitet.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok ein "wenig" scrollen ist eine minderschwere Untertreibung xD. hab mir jetzt die komplette erste Seite durchgelesen, leider in allen Belangen nur Bahnhof verstanden, und habe die erkenntniss gewonnen das ich um so etwas manuel umzusetzen ja auch noch genau wissen müsste wann in VB welcher Codeteil, in welcher Farbe dargestellt werden soll.

    Ich interpretiere deine Antwort somit eher als "nein gibt es nicht und wenn der ersteller der FastColoredTextBox keine alternative speziell für die WPF erstellt wird das auch nix". Schade eigentlich, dennoch danke für die Antwort =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Da gibt ja jemand schnell auf. Naja

    Es gibt eben nicht immer alles fertig. Das ist nun mal so.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Achja, nur mal so als Tipp.

    Hättest du es probiert (selbst dafür warst du zu faul) hättest du bemerkt das auch die vom XCeed mitgelieferten Formatter das können. Nur eben nicht beim Tippen. Aber für Copy And Paste aus VS raus wird alles korrekt formattiert.

    Siehste an meinem Testprojekt hier wo ich die RTB auch verwende.

    Aber wer nicht will der hat schon. 8o
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Naja, die WPF um diese für "normale" Programme zu lernen ist schon MEHR als komplex genug. Aber irgendwie ufert das ganze einfach aus, ist halt sehr schade wenn man die "überlegene" WPF lernen möchte, dann aber durch die Bank weg alles selber machen soll, was es bei Forms schon seit Ewigkeiten gibt oder sehe ich das falsch ?
    Ich habe ja danach gefragt, ob es so etwas in fertig gibt, weil es mir als Grundlage für mein erstes WPF-Projekt dienen sollte, soetwas aber dann von Grund auf selbst zu schreiben, was mich selbst in Forms mehr als nur vollkommen überfordern würde, milde ausgedrückt was mir selbst in Forms absolut unmöglich wäre, dann auch noch in der WPF, im ersten Projekt selber zu machen ??? Ja, da muss ich leider aufgeben. Es mag Programmiergenies wie dich oder Erfinder des Rades oder VaporiZed hier im Forum und meinetwegen auf der ganzen welt geben, ich zähle definitiv nicht dazu, ich habe leider kein automatisches Verständniss für derartig komplexe sachen, ich selber finde es schon kompliziert genug mich jetzt erstmal in das (für mich) extrem komplizierte Thema Binding und Xaml einzuarbeiten, und sorry ich habe absolut keine Ahnung wie SyntaxHighlightning funktioniert, habe damals auch Wochen damit zugebracht ein eigenes Highlighting für die FastColoredTextBox zu erstellen, was mir nciht gelungen ist ! Und da hätte ich nicht vom Scratch aus anfangen müssen.

    Also ja, ich gebe auf, aus deine Sicht halt zu schnell, aus meiner verlangst du hier allerdings schlicht unlösbares.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Achso, und du denkst wir (die von dir genannten) haben das aus dem Ärmel geschüttelt? Ne, leider nicht. Wir haben es auch gelernt.

    Richtig. Es gibt einiges für WinForms was es für WPF nicht gibt. WPF gibt es auch noch nicht so lange wie WinForms. Aber gut, du hast dir ja nicht mal den Code überhaupt nur angesehen. Denn das es nur 5-10 Zeilen Code sind einen solchen Formatter zu implementieren ist ja anscheinend Nebensache, und da frage ich mich warum du es eigendlich versuchst wenn du gar nicht willst, zumindest macht es den Eindruck - kannst mich aber gerne korrigieren.

    Ich denke ich bin jemand der bereit ist anderen zu Helfen und versuche immer gerne mit erklärungen auf den richtigen Weg zu helfen aber wenn jemand nicht mal danach Fragt kann ich auch nicht helfen. Dann muss ich dir aber auch sagen das das so nix wird.

    Die Info das es für das was DU vorhast erstmal OutOfTheBox funktionieren würde ist nebensächlich oder. Ich halts nicht aus. Also selbst wenn es was fertiges gibt gibst du auf, na dir kann echt keiner mehr helfen.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Aber gut, du hast dir ja nicht mal den Code überhaupt nur angesehen. Denn das es nur 5-10 Zeilen Code sind einen solchen Formatter zu implementieren ist ja anscheinend Nebensache

    Selbstredend habe ich mir den Code angesehen (dieses Control von XCeed), hab mir auf der von dir geposteten Seite, das Teil runtergeladen, ist ein Projekt mit gefühlt milliarden ordnern drin, also kein Control oder so, und das ganze ist auch noch in C# geschrieben, hilft mir also auch nicht. des weiteren ist dort nirgends ersichtlich wie ich mit "ein paar zeilen Code" einen, du nanntest es, Formatter erstellen kann.

    Die Info das es für das was DU vorhast erstmal OutOfTheBox funktionieren würde ist nebensächlich oder.

    Wo genau steht irgendwas davon das es bereits eine OutOfTheBox-Lösung gibt ? des Weiteren würde simples "er übernimmt das Format beim einfügen" auch nicht seinen Zweck erfüllen, man soll ja auch manuell tippen können. Also gibt es hier nichts "fertiges" etwas fertiges wäre einfach ne .dll und danach stünde ein Usercontrol zur verfügung.

    Ebenso, wenn ich das Xceed Projekt starte, die RichTextBox anwähle, und oben z.B. auf Xaml stelle, ist da absolut nix farbig. Scheint also zumindest noch nichmalt zu funktionieren.(siehe anhang)


    Ich weiss durchaus zu schätzen das du mit deinen Links nur helfen wolltest. hilft mir nur in der form nicht wieter. Bleibt nur zu hoffen das irgendwann eine WPF-Konforme FastColoredTextBox kommt, evtl. kann man dann mal mit so einem Projekt anfangen.
    Bilder
    • rtb.JPG

      41,66 kB, 874×445, 37 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @shad
    Coole Sache. Zwar auch nicht genau das was er sucht aber für das was er es braucht (wenn ich richtig liege) genau richtig. Oversized aber genau richtig.

    Danke für den Link, muss ich mir auch mal genauer ansehen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ich trau mich ja schon gar nicht mehr zu schreiben, aber wie funktioniert das, habe das nugetpaket geladen, aber in der toolbox taucht kein Control auf, und in der Documentation dazu steht kein Wort darüber wie man es benutzt...
    Und wenn ich die Documentation richtig deute, ist auch hier kein bereits enthaltenes VB-Highlightning, sondern mann müsste sich auch hier eines "basteln" ?

    Edit: ok unter codeproject.com/Articles/42490…valonEdit-WPF-Text-Editor stellt es sich so dar als hätte es bereits VB-Highlightning integriert
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „asusdk“ ()

    Das taucht auch nicht in der Toolbox auf solange du es dieser nicht hinzufügst.

    Aber wie in den ersten Kapiteln meiner Tutorialreihe bereits mehrfach erklärt gebe ich dir den Rat. Verabschiede dirch von der ToolBox. Du hast in Xaml intellisense. Nutze diese und du kommst viel schneller ans Ziel.
    Aber zurück zum Thema.

    Erstmal musst du die Library ins XAML importieren.
    Da hilft dir auch die Intellisense. Einfach "xmlns:avalon=" Tippen (wobei "avalon" ein selbst gewählter importname ist) und schon kommen Vorschläge. nun einfach "Aval" tippen und schon haste den richtigen Import.
    So sollte der Import nun aussehen:

    XML-Quellcode

    1. xmlns:avalon="http://icsharpcode.net/sharpdevelop/avalonedit"


    Nun kannst du die Controls aus dem Paket einfach nutzen. z.b.:

    XML-Quellcode

    1. <avalon:TextEditor
    2. Name="textEditor"
    3. SyntaxHighlighting="VB"
    4. FontFamily="Consolas" Text="Dim abs as New UserControl()"
    5. FontSize="10pt"/>


    Aber man sieht. Du hast dir die Tutorialreihe nicht angesehen. Denn das zeige ich in den Beiträgen, im PDF und in den Videos. Also zeigt das das du 0 gelernt hast.
    Es ist verständlich das es dir zu hoch vorkommt, finde ich aber schade denn anscheinend hättest du ja interesse.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Oh doch, angesehen hab ich mir die videos durchaus, aber wenn ich es nicht mindestens 10-20 mal verwendet habe, kann ich mir das nicht merken, und naja, ich finds auch nicht besonders Simpel mir etwas zu merken das mit einer kryptischen Buchstaben-Folge beginnt, wie eben xmlns gefolgt von doppelpunkt und co. da bin ich wohl ein wenig verwöhnt durch VB, wo so gut wie alles aus Worten besteht, statt aus kürzeln, aber das wird schon.

    Wie gesagt ich möchte mein erstes Projekt ja hier beginnen. Learning by doing, wie soll denn sonst aus den Videos etwas hängen bleiben ? Und ja, alle Videos hab ich noch nciht geguckt, da mir nach 1-2 Videos erstmal der Kopf raucht, ich habe bisher geguckt bis zum thema 2.1.1.2-Trigger
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Es ist verständlich das dir das so vorkommt. Vieleicht zur erklärung denn das wie du sagst "kryptische" kommt vom ganz normalem XML Dialekt.

    XMLNS bedeutet: XML NameSpace

    Weil man damit einen Namespace importiert.
    Wie in VB mit: Import BlaBla

    Jetzt klarer??

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das macht schon mal durchaus Sinn.

    Ich möchte mich auf jeden Fall entschuldigen wenn es oft so rüber kommt als würde ich nciht lernen wollen, ich weiss das es/ich oft so wirke, ich fühl mich manchmal einfach sauschnell überfordert und dann macht der Kop erst recht zu... Ich kann hier nur um Entschuldigung und um deine Geduld bitten....

    Danke euch beiden für die Hilfe, damit hab ich schon mal einen Grundstock zum anfangen =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    ich fühl mich manchmal einfach sauschnell überfordert

    Das ist ja überhaupt kein problem. Zu meiner Tutorialreihe gibt es einen Supporttrhead. Wenn du etwas nicht verstehst oder wo probleme hast kannst du dort Nachfragen.

    Ein Beispiel ist das mit den XAML Namespaces. Wenn dir das Spanisch vorkommt kannst du im Supporthtread nachfragen und auf das Kapitel verweisen/verlinken. Dann werde ich es gerne erklären. Ist überhaupt nichts dabei. Du musst aber verstehen das ich da schon leicht sauer werde wenn jemand Dinge fragt die ich dort erkläre, keine Frage dazu aufgetaucht ist, und dann mekert das sei Kryptisch und unverständlich. Unverständlich ist es ja nur so lange man sich nicht damit auseinandersetzt.

    Ein Zitat aus dem Kapitel Namespaces:

    Nofear23m schrieb:

    Was ist ein XAML-Namespace?
    Wie in XML-Namespaces ist ein XAML-Namespace eine Erweiterung dieses Konzepts.
    Eine etwas technische Beschreibung des Begriffs gibt es auf MSDN unter folgenden Link: msdn.microsoft.com/de-de/library/ms747086(v=vs.110).aspx
    Ich möchte es allerdings etwas verständlicher beschreiben. Im Grunde kann man sich einen Namespaceimport vorstellen wie in VB einen "Import" im Code. Eine ganz gute Beschreibung findet man auch hier im Forum vom User @ErfinderDesRades unter folgendem Link: XAML Syntax


    Da haste ne erklärung, einen Link zur MSDN und noch einen zu einem Tutorial von @ErfinderDesRades.
    Uns wie gesagt, Frag einfach nach, damit habe ich überhaupt kein Problem. :thumbup:

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Eine kleine "Offtopic" Anmerkung:
    Gib nicht so schnell auf, der Umstieg von WinForms zu WPF kann sehr hart sein, du wirst noch sehr oft gegen die Wand laufen, an einigen Stellen verzweifeln und manchmal merkwürdige Workarounds benutzten (*hust* PasswordBox Binding *hust*) aber am Ende lohnt es sich und es wird dich ein gutes Stück voran bringen.
    Hallo,

    nun auch eine kleine Frage von mir.
    Da ich so ein ähnliches Tool wie @asusdk auch geschrieben habe, stande ich vor dem gleichen Problem wie er.
    Ich habe mir jetzt das ​TextEdit von Avolon geholt und auch ein wenig damit herumprobiert. Es ist genau das, was ich brauche.

    Allerdings gibt es jetzt das Problem, dass das Text Property anscheinend kein Dependency Property ist, d.h. mann kann nicht an es binden.
    In meinem Programm gibt es im ViewModel jetzt halt eine Eigenschaft SnippetText, die ich normalerweise an das Text Property gebunden hätte.

    Gibt es irgendeinen Workaround (im Internet habe ich schon viel gelesen, aber nichts hat so richtig funktioniert), wie ich das TextEdit Control doch noch verwenden kann. Weil sonst ist es schon genial.

    PS: Ach ja @asusdk - Die WPF ist am anfang echt schwierig und unverständlich und man denkt sich, warum so kompliziert wenn es unter WinForms so einfach geht (so ging es mir vor einem viertel Jahr auch), aber wenn man es einmal verstanden hat, macht es richtig Spaß und vereinfacht vieles was man früher in WinForms mit viel Code lösen musste.

    Viele Grüße
    Florian
    Hallo Flori

    Wäre das nicht genau der richtige Einsatz für ein AttachedProperty?
    Das Kapitel ist ja bereits fertig. Versuchs mal. Wirst sehen wie einfach man so ein zusätzliches DependencyProperty implementieren kann.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,

    ach man manchmal ärgere ich mich über mich selbt, warum ich nicht auf die Lösung komme.
    Klar kann man das super verwenden und es funktioniert dann auch.

    Anbei mal dier Code, der verwendet wurde:


    Das MainWindow (einfach 1 TextEditor von Avalon und eine TextBox um das Binding zu testen):

    XML-Quellcode

    1. <Window x:Class="AvalonTextEditBindingHelper.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:AvalonTextEditBindingHelper"
    7. xmlns:avalon="http://icsharpcode.net/sharpdevelop/avalonedit"
    8. xmlns:vm="clr-namespace:AvalonTextEditBindingHelper"
    9. mc:Ignorable="d"
    10. Title="MainWindow" Height="450" Width="800">
    11. <Window.DataContext>
    12. <vm:MainViewModel/>
    13. </Window.DataContext>
    14. <Grid>
    15. <Grid.RowDefinitions>
    16. <RowDefinition Height="*"/>
    17. <RowDefinition Height="*"/>
    18. </Grid.RowDefinitions>
    19. <avalon:TextEditor vm:AvalonBindingTextHelper.Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" SyntaxHighlighting="C#">
    20. </avalon:TextEditor>
    21. <TextBox Grid.Row="1" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}">
    22. </TextBox>
    23. </Grid>
    24. </Window>



    Die MainViewModel Klasse (ganz simpel mit einem TextProperty):

    C#-Quellcode

    1. public class MainViewModel : ViewModelBase
    2. {
    3. private string _Text;
    4. public string Text
    5. {
    6. get { return _Text; }
    7. set { _Text = value; RaisePropertyChanged(); }
    8. }
    9. public MainViewModel()
    10. {
    11. Text = "public in i = 0;";
    12. }
    13. }



    Und hier noch die Klasse mit dem AttacedProperty (nur noch schnell heute NAcht geschrieben, dürfte nicht optimal sein und hat bestimmt auch noch Verbesserungspotential):

    C#-Quellcode

    1. public class AvalonBindingTextHelper : DependencyObject
    2. {
    3. public static string GetText(DependencyObject obj)
    4. {
    5. return (string)obj.GetValue(TextProperty);
    6. }
    7. public static void SetText(DependencyObject obj, string value)
    8. {
    9. obj.SetValue(TextProperty, value);
    10. }
    11. // Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
    12. public static readonly DependencyProperty TextProperty =
    13. DependencyProperty.RegisterAttached("Text", typeof(string), typeof(AvalonBindingTextHelper), new PropertyMetadata("sdf", TextProperty_Changed));
    14. private static void TextProperty_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    15. {
    16. TextEditor editor = (TextEditor)d;
    17. editor.Text = e.NewValue.ToString();
    18. }
    19. }



    So nun kommt noch eine Frage von mir:
    Das Binding in die eine Richtung funktioniert ja problemlos (also von der normalen Textbox in die Avalon) aber wenn ich den Text in der Avalon ändere, wird er nicht zurück in das Property geschrieben. Ist bestimmt relativ einfach, ich stehe nur wieder auf dem Schlauch :D
    - Meine Gedanken sind, dass man ja irgendwie die Texteingabe abfangen muss, wiel die wird ja nicht an dieses Text Property gemeldet. Wo und wie man das macht, fällt mir gerade aber nicht ein -

    Viele Grüße
    Florian