我需要一个文本控件,用户可以在其中编辑文本,并且文本的某些部分可以根据文本具有不同的颜色。基本上,想象一下 Visual Studio 源文件编辑器或任何其他为源代码着色的源文件编辑器。那是什么WPF控件?我所知道的 WPF 中的三个选项都不是不合适的:
TextBox 不允许颜色
TextBlock 不允许用户编辑文本
RichTextBox 允许太多 - 我只想要颜色。
也许 RichTextBox 可以固定其他文本格式(即字体、粗体、斜体)?有什么想法吗?
最佳答案
这是一个(非常)粗略的例子,坚持使用 TextBox 和 TextBlock:只是为了好玩,但值得......
这是 XAML...
<Grid>
<TextBlock
x:Name="Tx1"
HorizontalAlignment="{Binding Path=HorizontalAlignment, ElementName=Tb1}"
VerticalAlignment="{Binding Path=VerticalAlignment, ElementName=Tb1}"
Margin="{Binding Path=Margin, ElementName=Tb1}"
FontSize="{Binding Path=FontSize, ElementName=Tb1}"
/>
<TextBox
x:Name="Tb1"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Margin="100,0"
FontSize="24"
Background="Transparent"
Foreground="Transparent"
TextChanged="Tb1_TextChanged"
/>
</Grid>
...这是一些代码...
private void Tb1_TextChanged(object sender, TextChangedEventArgs e)
{
var inlines = this.Tx1.Inlines;
inlines.Clear();
foreach (char ch in this.Tb1.Text)
{
if (Char.IsDigit(ch))
{
var run = new Run(ch.ToString());
run.Foreground = Brushes.Blue;
inlines.Add(run);
}
else if (Char.IsLetter(ch))
{
var run = new Run(ch.ToString());
run.Foreground = Brushes.Red;
inlines.Add(run);
}
else
{
var run = new Run(ch.ToString());
run.Foreground = Brushes.LimeGreen;
inlines.Add(run);
}
}
}
诀窍是在 TextBlock 上使用透明的 TextBox ,它可以通过收集许多不同的 Run 元素来着色。
关于仅带颜色的 WPF 文本控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30702527/