【问题标题】:Format single character in wpf ListView在wpf ListView中格式化单个字符
【发布时间】: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


【解决方案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>

我制作了一个自定义文本块,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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多