Изменение шрифта отдельных слов в TreeView

138
03 июня 2019, 02:00

Пишу программу, в которой необходимо в TreeView (в узлах всех уровней) выделять отдельные слова, указанные в словаре, жирным шрифтом. Поискав решение в интернете, я понял, что одним из вариантов является использование IValueConverter'а. Проблема в том, что, при таком коде, программа называет все узлы TreeView как "System.WindowsControls.TextBlock". Я подозреваю, что причина вывода некорректных названий может заключаться в отсутствии конвертации одного типа данных в другой.

Помогите разобраться в чём проблема.

Код XAML:

<Window.Resources>
    <local:tvFontConverter x:Key="TVfontConverter"/>
</Window.Resources>
<Grid>
    <Button Name="Button1" Margin="10,200,25,20" Height="30" Click="Button1_Click">Button</Button>
    <TreeView x:Name="treeView1" Margin="10,10,10,70">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
                <TextBlock Text="{Binding Name, Converter={StaticResource TVfontConverter}}">
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid>

Код программы:

 public partial class MainWindow : Window
    {
    ObservableCollection<Node> nodes;
    public static Dictionary<string, FontWeight> tvKeywords = new Dictionary<string, FontWeight>();
    public MainWindow()
        {
            InitializeComponent();                
        }
    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        tvKeywords.Add("Иван", FontWeights.Bold);            
        nodes = new ObservableCollection<Node>
    {
        new Node
        {
            Name ="Иванов Иван Иванович",
            Nodes = new ObservableCollection<Node>
            {                    
                new Node
                {
                    Name ="Иванова Юлия Ивановна",
                    Nodes = new ObservableCollection<Node>
                    {
                        new Node {Name="Иванов Иван Петрович" },                            
                        new Node
                        {
                            Name = "Иванова Ольга Петровна",
                            Nodes = new ObservableCollection<Node>
                            {
                                new Node {Name="Иванов Иван Иванович" },
                            }
                        }                    
                    }
                }
            }
        },
        new Node
        {
            Name ="Петров Петр Иванович",
            Nodes = new ObservableCollection<Node>
            {
                new Node {Name="Петров Антон Петрович" },
                new Node {Name="Петров Иван Петрович" }                    
            }
        }            
    };
        treeView1.ItemsSource = nodes;
    }        
}
// Класс конвертера для TreeView
public class tvFontConverter : IValueConverter
{        
        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
            var tvcontent = Convert.ToString(value);
            var tvdict = MainWindow.tvKeywords;
            var tvoutString = "<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"  xml:space=\"preserve\">";
            foreach (var word in tvcontent.Split(' '))
            {
                var converted = word;
                FontWeight fs;
                if (tvdict.TryGetValue(word, out fs))
                {
                    var run = new Run(word);
                    run.FontWeight = fs;
                    converted = System.Windows.Markup.XamlWriter.Save(run);
                }
                tvoutString += converted + " ";
            }
            tvoutString += "</TextBlock>";
            var prov = System.Windows.Markup.XamlReader.Parse(tvoutString);
            return System.Windows.Markup.XamlReader.Parse(tvoutString);
        }
        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
            throw new NotImplementedException();
        }
    }
READ ALSO
Вставить картинку в тело письма

Вставить картинку в тело письма

Вопрос такой, как вставить картинку в тело сообщения? Искал в интернете, находил AlternateView jpeg_view = new AlternateView, но не помогаетсообщение на почте...

160
Возможные проблемы с модификатором in

Возможные проблемы с модификатором in

Читал про новые фичи C# и ключевое слово in для параметров

160
Как обобщить наследуемые объекты COM?

Как обобщить наследуемые объекты COM?

Базовый класс для всех COM объектов:

175