C# …这当然是最好的解决方案,但我以前从未使用过它,所以我不知道如何做到这一点。WPF中的列表框可以显示您喜欢的任何内容。图片、文字、形状、线条。为什么要从头开始构建,而你需要的一切都在那里,甚至不用滥用列表框。事实上,列表框显示的是文本,但只是使用了不同的表

C# …这当然是最好的解决方案,但我以前从未使用过它,所以我不知道如何做到这一点。WPF中的列表框可以显示您喜欢的任何内容。图片、文字、形状、线条。为什么要从头开始构建,而你需要的一切都在那里,甚至不用滥用列表框。事实上,列表框显示的是文本,但只是使用了不同的表,c#,C#,…这当然是最好的解决方案,但我以前从未使用过它,所以我不知道如何做到这一点。WPF中的列表框可以显示您喜欢的任何内容。图片、文字、形状、线条。为什么要从头开始构建,而你需要的一切都在那里,甚至不用滥用列表框。事实上,列表框显示的是文本,但只是使用了不同的表示方式。@hs2d,我添加了一个示例。请看我的答案。必须更改xaml:和c代码:case VersionStatus。原始:返回“绿色”。。等等,让它工作。@hs2d,我不明白你为什么要这么做。我打赌您错过了一些包含Brusks类的命名空间声明


…这当然是最好的解决方案,但我以前从未使用过它,所以我不知道如何做到这一点。WPF中的列表框可以显示您喜欢的任何内容。图片、文字、形状、线条。为什么要从头开始构建,而你需要的一切都在那里,甚至不用滥用列表框。事实上,列表框显示的是文本,但只是使用了不同的表示方式。@hs2d,我添加了一个示例。请看我的答案。必须更改xaml:和c代码:case VersionStatus。原始:返回“绿色”。。等等,让它工作。@hs2d,我不明白你为什么要这么做。我打赌您错过了一些包含Brusks类的命名空间声明。我也不知道你为什么改为笔划而不是填充,但那没关系。啊,是的。我创建了一个新的应用程序,一切都像你展示的那样工作。我不知道上一次出了什么问题。
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Window.Resources>
        <local:StatusToBrushConverter x:Key="statusToBrushConverter" />
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding}"
                 SelectionChanged="ListBox_SelectionChanged">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="HorizontalContentAlignment"
                            Value="Stretch" />
                    <Setter Property="Opacity"
                            Value="0.5" />
                    <Setter Property="MaxHeight"
                            Value="1" />
                    <Setter Property="MinHeight"
                            Value="1" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected"
                                 Value="True">
                            <Trigger.Setters>
                                <Setter Property="Opacity"
                                        Value="1.0" />
                            </Trigger.Setters>
                        </Trigger>
                    </Style.Triggers>
                </Style>

            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Rectangle StrokeThickness="0"
                               Stroke="Green"
                               Fill="{Binding Status, Converter={StaticResource statusToBrushConverter}}"
                               Height="1"
                               HorizontalAlignment="Stretch" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <TextBox AcceptsReturn="True"
                 Grid.Column="1"
                 x:Name="codeBox" />
    </Grid>
</Window>
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {
        private CodeLines lines;

        public MainWindow()
        {
            InitializeComponent();

            lines = new CodeLines();

            Random random = new Random();
            for (int i = 0; i < 200; i++)
            {
                lines.Add(new CodeLine { Status = (VersionStatus)random.Next(0, 5), Line = "Line " + i });
            }

            this.DataContext = lines;

            codeBox.Text = String.Join("\n",  from line in lines
                                            select line.Line);
        }

        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectedLine = ((ListBox)sender).SelectedIndex;
            codeBox.ScrollToLine(selectedLine);
        }
    }

    public enum VersionStatus
    {
        Original,
        Added,
        Modified,
        Deleted
    }

    public class CodeLine : INotifyPropertyChanged
    {

        private VersionStatus status;

        public VersionStatus Status
        {
            get { return status; }
            set
            {
                if (status != value)
                {
                    status = value;
                    OnPropertyChanged("Status");
                }
            }
        }

        private string line;

        public string Line
        {
            get { return line; }
            set
            {
                if (line != value)
                {
                    line = value;
                    OnPropertyChanged("Line");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            var p = PropertyChanged;
            if (p != null)
            {
                p(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class CodeLines : ObservableCollection<CodeLine>
    {
    }


    class StatusToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var status = (VersionStatus)value;
            switch (status)
            {
                case VersionStatus.Original:
                    return Brushes.Green;
                case VersionStatus.Added:
                    return Brushes.Blue;
                case VersionStatus.Modified:
                    return Brushes.Yellow;
                case VersionStatus.Deleted:
                    return Brushes.Red;
                default:
                    return DependencyProperty.UnsetValue;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}