突出显示texblock(WPF)中部分文本时的未知空间

时间:2016-07-11 00:22:39

标签: c# wpf format highlight

从试验和错误中我设法突出显示文本块中文本的一部分,该文本块位于与自定义类属性相关的列表框的数据窗口中。但现在的问题是,当突出显示文本时,我会在突出显示的文本和文本的其余部分之间找到一个奇怪的未知空间。

这是XAML的一部分

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBox Name="textBox1" TextChanged="textBox1_TextChanged"/>
    <ListBox Grid.Row="1" Name="listBox1">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Name="gridOfListbox" Height="25" Margin="0,2">
                    <DockPanel Name="dockpanelWithTxtBlock">
                        <TextBlock Name="textbloxk" DockPanel.Dock="Left" FontSize="15" TextAlignment="Center">
                            <Run Background="Yellow" Text=""></Run>
                            <Run Text="{Binding ProductID}"></Run>
                        </TextBlock>
                    </DockPanel>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

这里使用了部分代码

ObservableCollection<TItem> items = new ObservableCollection<TItem>();
TItem[] source = new TItem[] { new TItem("Hello"), new TItem("World"), new TItem("System"), new TItem("SystemDefault"), new TItem("SystemFolder") };

事件的方法changetext

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        string match = textBox1.Text;
        foreach (TItem TItem in listBox1.Items)
        {
            ListBoxItem lbi = (ListBoxItem)this.listBox1.ItemContainerGenerator.ContainerFromItem(TItem);
            TextBlock txtBlck = FindFirstElementInVisualTree<TextBlock>(lbi);
            Run bold = (Run)txtBlck.Inlines.FirstInline;
            Run normal = (Run)txtBlck.Inlines.LastInline;

            string s = bold.Text + normal.Text;

            if (s.ToLower().StartsWith(match.ToLower()))
            {
                bold.Text = s.Substring(0, match.Length);
                normal.Text = s.Substring(match.Length);
            }
            else
            {
                bold.Text = "";
                normal.Text = s;
            }
        }
    }

FindFirstElementInVisualTree方法用于查找搜索所需的文本框。

如果需要更多代码,请告诉我。 我还添加了一个图像来演示问题所在。 将不胜感激! 图片链接:http://i.stack.imgur.com/rOj0m.png

1 个答案:

答案 0 :(得分:1)

在XAML中的Run内使用TextBlock时,未包含在<>中的所有内容都被视为实际字符串。换行意味着一个空间。将两个Run放在同一行中(两者之间也没有空格)。

<TextBlock Name="textbloxk" DockPanel.Dock="Left" FontSize="15" TextAlignment="Center">
    <Run Background="Yellow" Text="" /><Run Text="{Binding ProductID}" />
</TextBlock>

修改

顺便说一下,我刚看到你的first question被标记为重复。正确地问这个问题;所以你将来应该以这种方式提问。