Я расширяю IDE с открытым исходным кодом для поддержки пользовательского языка программирования.Формат одиночного символа в wpf ListView
Я создал двигатель разницы, проверяющий отличия от файла. Теперь я показываю различия в двух списках wpf (черепичные по вертикали).
Я знаю отдельные символы, которые отличаются друг от друга, но в этот момент я отформатирую всю строку с другим цветом переднего плана (в качестве сравнения TFS). Для добавленных или удаленных строк этого достаточно. Но для измененных строк я хочу полужирным шрифтом или пометить точный символ (например, WinMerge).
Как это сделать?
Спасибо всем. Andrea
EDIT: Это код:
XAML из ListView:
<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>
CodeBehind:
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;
}
}
Для этого вам понадобится специальный элемент управления. См. [Этот ответ] (http://stackoverflow.com/questions/7854570/how-to-implement-a-search-that-causes-multi-column-record-filtering-in-xamdatagr/7956628#7956628) для чего-то подобный – Pikoh
Вы можете показать пример с минимальным кодом? –
@MachineLearning Я добавил пример кода – Andrea