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();
}
}
}