Laden...

Texte von ListBoxItems farblich hervorheben, die zur Laufzeit generiert wurden

Erstellt von zero_x vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.317 Views
zero_x Themenstarter:in
1.044 Beiträge seit 2008
vor 14 Jahren
Texte von ListBoxItems farblich hervorheben, die zur Laufzeit generiert wurden

Hallo Leute,

ich möchte auf einer ListBox Daten anzeigen, wo einzelne Wörter farblich gekennzeichnet sind. Die Vorgehensweise, die ich verwendet habe, ist ein einfaches DataTemplate mit einer ItemsSource, die an der ListBox gebunden ist. Im DataTemplate befinden sich merhere TextBlocks.

Wie ist es möglich von der ItemsSource heraus einige Wörter fabrlich zu kennzuzeichnen? Hier habe ich eine - in meinen Augen schlechte - Lösung gefunden, wo die Controls einfach erzeugt werden. Gibt es irgendwelche Alternativen oder Möglichkeiten um gegen mein Problem vorzugehen?

zero_x

U
1.578 Beiträge seit 2009
vor 14 Jahren

da gabs hier ma n thread wo es n vorschlag gab wie man suchergebnisse entsprechend markiert
aaaalso

bastel dir ein template wo das binding entsprechend ist (binding nicht auf text)


<ListBox ItemSource="{Binding Data}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Binding Path="{Binding Path=.}" Converter="{StaticResource DataToRunsConverter}" />
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

im converter dann erstellst du lauter run objekte mit den entsprechenden formatierungen
du brauchst nur die entsprechenden daten im objekt die angeben was wie wo aus zu sehen hat

zero_x Themenstarter:in
1.044 Beiträge seit 2008
vor 14 Jahren

Hallo Mr Evil,

da gabs hier ma n thread wo es n vorschlag gab wie man suchergebnisse entsprechend markiert

Hier im Forum habe ich schon gesucht, allerdings nichts gefunden. 🤔

Dein Beispiel habe ich getestet, aber es scheint nicht zu funktionieren. Kanns du die Funktionsweise ein wenig genauer erläutern?

zero_x

U
1.578 Beiträge seit 2009
vor 14 Jahren

das war der hier
Gesuchten Text in gefundenen Einträgen hervorheben
wird dir aber denk ich nicht weiter helfen

waere interessant zu wissen was du versucht hast
ich versuch mal die idee zu konstruieren
man hat ein objekt - das repraesentiert ein string inklusive markierungs informationen

public class FormattedString
{
    public string Text { get; set; }
    public string[] FormattedWords { get; set; }
}

so
dies hat man in einer liste mit den notwendigen informationen - und die listbox schickt das durch einen converter

public class QuatschViewModel : ViewModelBase
{
    public ObservableCollection<FormattedString> FormattedStrings { get; set; }
    public QuatschViewModel ()
    {
        // fuellen von FormattedStrings
    }
}
<Window ...>
    <Window.Resources>
        <converter:StringFormatter x:Key="StringFormatter" />
    </Window.Resources>
    <ListBox ItemsSource="{Binding FormattedStrings}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock>
                    <Binding Path="." Converter="{StaticResource StringFormatter}" />
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

der converter macht dann nichts weiter ausser lauter run objekte zu bauen die aneinander gehangen zurueck gegeben werden
genau da weiss ich auch nicht wie man das machen koennte

public sealed class StringFormatter : IValueConverter
{
    public object ConvertTo(object value, ...)
    {
        // value ist nun vom typ FormattedString
        // der text muss nun in den verschiedenen run objekten aufgeteilt werden - evtl kann man die in ein horizontalen stackpanel packen
    }
}

ne andere idee waere das man kein TextBlock nimmt sondern ein ContentControl - und das content bindet man mit dem converter
der converter kann dann ein textblock mit den run objekten erstellen und zurueck geben

<Window ...>
    <Window.Resources>
        <converter:StringFormatter x:Key="StringFormatter" />
    </Window.Resources>
    <ListBox ItemsSource="{Binding FormattedStrings}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding Path=., Converter={StaticResource StringFormatter}}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>
public sealed class StringFormatter : IValueConverter
{
    public object ConvertTo(object value, ...)
    {
        // value ist nun vom typ FormattedString
        // der text muss nun in den verschiedenen run objekten aufgeteilt werden
        // pseudo - kenn die methoden grad nicht da alles hier im forum getippt

        FormattedString text = (FormattedString)value;
        TextBlock block = new TextBlock();
        block.Inlines.Add(new Run()); // word from text.Text formatted by FormattedWords if needed
        return block;
    }
}
zero_x Themenstarter:in
1.044 Beiträge seit 2008
vor 14 Jahren

Hallo Mr Evil,

danke!

zero_x