Пишу программу, в которой необходимо в 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();
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Вопрос такой, как вставить картинку в тело сообщения? Искал в интернете, находил AlternateView jpeg_view = new AlternateView, но не помогаетсообщение на почте...
Читал про новые фичи C# и ключевое слово in для параметров