Laden...

[gelöst] WPF - In einem String einzelne Buchstaben durch BackColor hervorheben

Erstellt von ErfinderDesRades vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.922 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren
[gelöst] WPF - In einem String einzelne Buchstaben durch BackColor hervorheben

Hi!

Ich hab ein Viewmodel, bestehend aus einem String und einer Auflistung von Positionen, an denen die Chars gehighlighted werden sollen.

Ich kann einem Textblock TextDecorations angedeihen lassen, aber damit kann ich nur Unterstreichungen setzen - das wäre bisserl zu unauffällig.

Ich kann auch einzelne Runs in den Textblock einfügen - aber das kann ich nur festverdrahtet im Xaml, mit binden geht da nix.

Der frühe Apfel fängt den Wurm.

Y
102 Beiträge seit 2005
vor 8 Jahren

Hi,

Vielleicht hilft dir folgender Link:

RichTextBox with Html

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

thx, aber das scheint mir mit Kanonen auf Spatzen ( > 10000 Zeilen Code ).

Jo, zur Not versuche ichs denn auch mit einer Readonly Richtextbox, und mein VM ensprechend konvertieren.
Aber ist immer noch mit Kanonen.

bislang markiere ich nur einen Buchstaben pro String, das krieg ich mit einem popeligen Textblock mit 3 Runs drinne ordentlich hin.

Der frühe Apfel fängt den Wurm.

5.658 Beiträge seit 2006
vor 8 Jahren

Hi ErfinderDesRades,

es muß ja gar nicht HTML sein, sondern man kann gleich das Richtext-Format verwenden, das bereits von der RichtextBox unterstützt wird. Alternativ muß dein ViewModel eben eine Datenstruktur zur Verfügung stellen, die Textinhalte mit der entsprechenden Formatierung beinhaltet. Dann kannst du auch mit DataBinding arbeiten.

Christian

Weeks of programming can save you hours of planning

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

nur kann ich Richtext noch weniger als Html.

Der frühe Apfel fängt den Wurm.

3.003 Beiträge seit 2006
vor 8 Jahren

Habe für was ähnliches mit Erfolg 'ne transparente Textbox mit exakt darunterlegtem Canvas, der den formatierten Text enthielt, benutzt. So um die 100 Zeilen für die Ableitung von FrameworkElement, und etwas XAML. Und etwas Geduld beim Layouten.

Vielleicht wäre die Technik auch in deinem Fall anwendbar?

LaTino
Edit: hier, die benutzen dafür etwas ganz Ähnliches: SyntaxHighlightBox (Codeplex)

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

ich bin iwie zu doof, da Sources zu downloaden.

Liegts daran, dass ich kein Codeplex-Account habe, oder unter dem Schutz von NoScript browse?

Nur eine dll konnte ich downen - aber das ist doch opensource?

Der frühe Apfel fängt den Wurm.

T
314 Beiträge seit 2013
vor 8 Jahren

Unter Downloads gibts die DLL. Unter Source Code den Code 😃.

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

ja, aber ich hätte gern den Code zum Downloaden, nicht die dll.

Den Code fand ich nur zum Angucken - was mir bei ca. 12 Files nicht wirklich was bring.

Der frühe Apfel fängt den Wurm.

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

ah - jetz! - sorry, halt Tomate auf Auge.

Jo, auf jeden Fall ein sehr cooles Control, an dem ich bestimmt noch was rumbasteln werde (hat zB soweit ich bislang sehe noch nix für BackColor - oder täusche ich mich?)

Mir ist letztes Jahr mein customizable BB-Code-Editor verschütt gegangen, den könnte ich damit glaub sehr gut neu auflegen.

Aber falls jmd. noch was einfällt, um mgl. lightweight den Hintergrund einzelner Buchstaben zu colorieren...

Der frühe Apfel fängt den Wurm.

J
641 Beiträge seit 2007
vor 8 Jahren

Textbox oder Textblock?

Im Textblock kannst du für den Inhalt einzelne "Run" Abschnitte verwenden und diese einfärben!

http://www.wpf-tutorial.com/basic-controls/the-textblock-control-inline-formatting/

cSharp Projekte : https://github.com/jogibear9988

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

Textblock. Und das Problem war, unterschiedlich gefärbte Runs dynamisch reinzukriegen, also statt im Xaml hardcoded, es über Bindings zu backen.

Aber ich hab mir jetzt eine leidlich simple Lösung gebastelt


   using TpSelf = InlinesBlockTester.Controls.AlterningRuns;

   [System.Windows.Markup.ContentProperty("RunStyles")]
   public class AlterningRuns : TextBlock {
      private static readonly Type tpSelf = typeof(TpSelf);
      private static readonly Style _EmptyStyle = new Style();

      public IEnumerable<string> Strings { get { return (IEnumerable<string>)GetValue(StringsProperty); } set { SetValue(StringsProperty, value); } }
      public static readonly DependencyProperty StringsProperty = DependencyProperty.Register("Strings", typeof(IEnumerable<string>), tpSelf, new PropertyMetadata(new string[0],
              (d, e) => { ((TpSelf)d).StringsChanged((IEnumerable<string>)e.NewValue); }));

      private Run ToRun(string s, int i) {
         var stl = _RunStyles[i % _RunStyles.Count];
         var rn = new Run(s);
         foreach (Setter st in stl.Setters) rn.SetValue(st.Property, st.Value);
         return rn;
      }
      private void StringsChanged(IEnumerable<string> value) {
         Inlines.Clear();
         if (!_IsInited || value == null) return;
         Inlines.AddRange(value.Select(ToRun));
      }
      private bool _IsInited = false;
      public override void EndInit() {
         base.EndInit();
         _IsInited = true;
         StringsChanged(Strings);
      }
      public List<Style> RunStyles { get { return _RunStyles; } }
      private List<Style> _RunStyles = new List<Style>(new Style[] { _EmptyStyle });
   }

Usage:


      <ic:AlterningRuns Strings="{Binding Strings}" >
        <Style TargetType="Run">
          <Setter Property="Background" Value="#FFffaCbC"/>
        </Style>
      </ic:AlterningRuns>

Kann halt nur alternieren - nicht etwa daten-spezifisch Runs zuordnen oder andere InLines als Run etc pp.

Aber so als Ansatz, und wenn ich mehr brauche, kann ich ja mehr dranmachen 🙂

Der frühe Apfel fängt den Wurm.