【发布时间】:2016-09-05 08:08:13
【问题描述】:
我正在扩展一个开源 IDE 以支持自定义编程语言。
我制作了一个差异引擎来检查文件之间的差异。现在我展示了两个 wpf listview 的差异(垂直平铺)。
我知道不同的单个字符,但此时我用不同的前景色格式化整行(作为 TFS 比较器)。对于添加或删除的行,这就足够了。但是对于更改的行,我想加粗或标记确切的字符(如 WinMerge)。
我该怎么做?
谢谢大家。 安德烈亚
编辑:这是代码:
ListView 的 XAML:
<ListView x:Name="editor" Background="White" Foreground="Black" SelectionMode="Single" BorderThickness="1" BorderBrush="DarkGray" Grid.Row="1">
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn x:Name="LNRow" Header="" DisplayMemberBinding="{Binding LNRow}" Width="75" />
<GridViewColumn x:Name="LRow" Header="" DisplayMemberBinding="{Binding LRow}" Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Converter={StaticResource WidthConverter}}" />
<GridViewColumn x:Name="RNRow" Header="" DisplayMemberBinding="{Binding RNRow}" Width="75" />
<GridViewColumn x:Name="RRow" Header="" DisplayMemberBinding="{Binding RRow}" Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Converter={StaticResource WidthConverter}}" />
</GridView>
</ListView.View>
<ListView.Resources>
<Style TargetType="GridViewColumnHeader">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Type}" Value="1">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="2">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Blue"/>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="3">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Resources>
</ListView>
代码隐藏:
foreach (DiffResultSpan drs in edits)
{
switch (drs.Status)
{
case DiffResultSpanStatus.NoChange:
for (i = 0; i < drs.Length; i++)
{
dri = new DiffResultItem();
dri.LNRow = cntL.ToString("00000");
dri.LRow = ((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line;
dri.RNRow = cntR.ToString("00000");
dri.RRow = ((TextLine)destination.GetByIndex(drs.DestIndex + i)).Line;
dri.Type = 0;
dri.Tag = drs;
dri.Row = row;
editor.Items.Add(dri);
list.Add(dri);
cntL++;
cntR++;
row++;
}
break;
case DiffResultSpanStatus.Replace:
for (i = 0; i < drs.Length; i++)
{
dri = new DiffResultItem();
dri.LNRow = cntL.ToString("00000");
dri.LRow = ((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line;
dri.RNRow = cntR.ToString("00000");
dri.RRow = ((TextLine)destination.GetByIndex(drs.DestIndex + i)).Line;
dri.Type = 2;
dri.Tag = drs;
dri.Row = row;
editor.Items.Add(dri);
list.Add(dri);
cntL++;
cntR++;
row++;
}
break;
case DiffResultSpanStatus.DeleteSource:
for (i = 0; i < drs.Length; i++)
{
dri = new DiffResultItem();
dri.LNRow = cntL.ToString("00000");
dri.LRow = ((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line;
dri.RNRow = "";
dri.RRow = "";
dri.Type = 3;
dri.Tag = drs;
dri.Row = row;
editor.Items.Add(dri);
list.Add(dri);
cntL++;
row++;
}
break;
case DiffResultSpanStatus.AddDestination:
for (i = 0; i < drs.Length; i++)
{
dri = new DiffResultItem();
dri.LNRow = "";
dri.LRow = "";
dri.RNRow = cntR.ToString("00000");
dri.RRow = ((TextLine)destination.GetByIndex(drs.DestIndex + i)).Line;
dri.Type = 1;
dri.Tag = drs;
dri.Row = row;
editor.Items.Add(dri);
list.Add(dri);
cntR++;
row++;
}
break;
}
}
【问题讨论】:
-
您需要一个自定义控件。请参阅this answer 了解类似情况
-
你能用最少的代码展示一个例子吗?
-
@MachineLearning 我添加了示例代码
-
@Andrea 是的,例如在后面的代码中......如果你有一个简单的案例(你的例子中要使用的字符和颜色在哪里?)我可以为你写一个答案,但也许这个 cmets 足以给你基本的想法
-
@Andrea 这是来自后面代码的example
标签: c# wpf listview formatting