如何在基于多行的控件中为文本着色

时间:2018-04-19 14:09:17

标签: c# wpf binding multiline text-coloring

环境:WPF,C#

我想要什么?: 我想显示一条消息日志,其中不同类型的消息(信息,警告,错误)以不同的样式显示。

enter image description here

问题是什么?: 根据我给出的架构,我需要使用绑定来完成此操作。目前有一个LogMessages集合,其中包含MessageType(枚举)。这个集合是我可以用来创建我的绑定。

在无数的例子中,我见过使用Run或直接访问Rich Text Control的解决方案。我无法做到。

那么有没有办法使用绑定和WPF给定控件来创建此效果?也许使用转换器?优选地,允许像使用常规文本框一样选择文本。

感谢任何建议

谢谢, 维达

解决方案

即使我希望实现一种整体文本框,用户可以像浏览器中那样选择不同的消息,但我最终使用样式触发器进行操作,就像下面建议的Dairon一样。

我现在可以使用户可以选择多条消息并将其作为字符串复制到缓存中。

    <ListBox ItemsSource="{Binding Messages}" BorderBrush="Black"

                HorizontalAlignment="Stretch" Margin="10,70,10,0" Height="107" VerticalAlignment="Top">
        <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="4">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Time}" FontWeight="DemiBold" />
                <TextBlock Grid.Column="1" Text="{Binding Message}">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=MsgType}" Value="Info">
                                    <Setter Property="Foreground" Value="DarkGray" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Path=MsgType}" Value="Warning">
                                    <Setter Property="Foreground" Value="DarkOrange" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Path=MsgType}" Value="Error">
                                    <Setter Property="Foreground" Value="DarkRed" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>

            </Grid>
        </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

1 个答案:

答案 0 :(得分:1)

我使用了Federico Berasategui的例子here。这个例子很完美,你应该从这里开始。为了处理不同的颜色,我将代码更改为:

LogEntry类:

public class LogEntry
{
    public LogEntry(DateTime dateTime, int index, string message, Color textColor)
    {
        DateTime = dateTime;
        Index = index;
        Message = message;
        TextColor = new SolidColorBrush(textColor);
        TextColor.Freeze();
    }

    public DateTime DateTime { get; set; }

    public int Index { get; set; }

    public string Message { get; set; }

    public SolidColorBrush TextColor { get; set; }
}

LogEntry显示的XAML部分:

<DataTemplate DataType="{x:Type local:LogEntry}">
    <Grid IsSharedSizeScope="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="Index" Width="Auto"/>
            <ColumnDefinition SharedSizeGroup="Date" Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <TextBlock Text="{Binding DateTime}" Grid.Column="0"
                   FontWeight="Bold" Margin="5,0,5,0"/>

        <TextBlock Text="{Binding Index}" Grid.Column="1"
                   FontWeight="Bold" Margin="0,0,2,0" />

        <TextBlock Text="{Binding Message}" Grid.Column="2"
                   TextWrapping="Wrap" Foreground="{Binding TextColor}"/>
    </Grid>
</DataTemplate>

我刚刚将一个TextColor属性添加到LogEntry类,并将其绑定到Foreground的{​​{1}}属性。

如果您不需要多级日志,请随意从示例中删除TextBlock个部分。当然,如果您只想处理日志中的文本消息,则可以删除DateTime和Index。如果你想要一个MessageType,你也可以添加你的枚举。

示例相当完整,但如果您不想要所有&#34;额外内容,那么您可以非常简单。