2016-09-05 2 views
1

Я расширяю 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; 
      } 
     } 
+1

Для этого вам понадобится специальный элемент управления. См. [Этот ответ] (http://stackoverflow.com/questions/7854570/how-to-implement-a-search-that-causes-multi-column-record-filtering-in-xamdatagr/7956628#7956628) для чего-то подобный – Pikoh

+0

Вы можете показать пример с минимальным кодом? –

+0

@MachineLearning Я добавил пример кода – Andrea

ответ

1

Хорошо, я решил. Я добавил DataTemplate в столбец с кодом. Здесь 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.CellTemplate> 
        <DataTemplate> 
         <local:DiffTextBlock Value="{Binding LRow}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <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> 

И я сделал Custom TextBlock, DiffTextBlock. Это код:

public class DiffTextBlock : TextBlock 
{ 
    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(DiffTextBlock), new UIPropertyMetadata(null, new PropertyChangedCallback(OnContentChanged))); 

    public string Value 
    { 
     get { return GetValue(ValueProperty) as string; } 
     set { SetValue(ValueProperty, value); } 
    } 

    static void OnContentChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     DiffTextBlock control = target as DiffTextBlock; 
     control.createParts(e.NewValue as string); 
    } 

    void createParts(string text) 
    { 
     this.Text = ""; 

     Inlines.Clear(); 

     // Inlines.Add(text); 
     // this.Text = text; 
     // Here I write my own algorithm for determine which characters highlight 
    } 
} 
Смежные вопросы