C# WPF-更改整个文本块行的颜色

C# WPF-更改整个文本块行的颜色,c#,wpf,C#,Wpf,在我的WPF应用程序中,我有两个文本块,通过运行代码来填充它们。每一行都应该有不同的背景色,这样更容易阅读。不幸的是,这些线条只在书写时才被染色。但我希望背景颜色覆盖整行,而不仅仅是书写区域 代码: for(int i=0;i

在我的WPF应用程序中,我有两个文本块,通过运行代码来填充它们。每一行都应该有不同的背景色,这样更容易阅读。不幸的是,这些线条只在书写时才被染色。但我希望背景颜色覆盖整行,而不仅仅是书写区域

代码:

for(int i=0;i

这两个文本块在中间是无缝拼接的,所以它看起来就像是单个文本块中的单行。如果这样做更容易,线之间的间距可以忽略不计

有没有不使用文本框或richtextbox的解决方案

编辑:

XAML代码:

<UserControl x:Class="MuseKeyGenApp.UCStartUp"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MuseKeyGenApp"
         mc:Ignorable="d"   
         Background = "#FF0069B4"
         d:DesignHeight="500" d:DesignWidth="800">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="26"/>
        <RowDefinition Height="0"/>
        <RowDefinition Height="*" MinHeight="80"/>
        <RowDefinition Height="*" MinHeight="80"/>
        <RowDefinition Height="*" MinHeight="80"/>
        <RowDefinition Height="*" MinHeight="80"/>
        <RowDefinition Height="*" MinHeight="80"/>
        <RowDefinition Height="0"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" MinWidth="150"/>
        <ColumnDefinition Width="0.75*" MinWidth="100"/>
        <ColumnDefinition Width="0.75*" MinWidth="100"/>
        <ColumnDefinition Width="0.75*" MinWidth="100"/>
        <ColumnDefinition Width="0.75*" MinWidth="100"/>
    </Grid.ColumnDefinitions>


    <ScrollViewer Grid.Row="2" Grid.RowSpan="3" Grid.Column="1" Grid.ColumnSpan="2" Margin="10,35,12,12" Name="sv_PrefixList">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="1*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" x:Name="tblock_StatisticsLeft" HorizontalAlignment="Stretch" LineHeight="20" TextWrapping="Wrap" Margin="0,0,0,0" Text="TextBlock" VerticalAlignment="Stretch" TextAlignment="Left"/>
            <TextBlock Grid.Column="1" x:Name="tblock_StatisticsRight" HorizontalAlignment="Stretch" LineHeight="20" TextWrapping="Wrap" Margin="0,0,10,0" Text="TextBlock" VerticalAlignment="Stretch" TextAlignment="Right"/>
        </Grid>
    </ScrollViewer>

</Grid>


我遗漏了控件中所有其他不相关的内容。

以下是正确的方法:

Xaml:

您可以(应该)使用
ItemsControl
。将其
ItemsSource
属性设置为您的
GlobalSettings.prefixList
集合,即用以下内容替换for循环:

ic.ItemsSource = GlobalSettings.prefixList;
确保“prefix”和“amount”是您的“prefix”类型的公共属性(而不是字段)或您所称的任何属性:

public string prefix { get; set; }
然后将带有文本块的
网格
放入
项目控件的
项目模板
,并将文本块绑定到“前缀”和“金额”属性:

<ScrollViewer Grid.Row="2" Grid.RowSpan="3" Grid.Column="1" Grid.ColumnSpan="2" Margin="10,35,12,12" Name="sv_PrefixList">
    <ItemsControl x:Name="ic" AlternationCount="2">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="grid">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" x:Name="tblock_StatisticsLeft" HorizontalAlignment="Stretch" LineHeight="20" TextWrapping="Wrap" Margin="0,0,0,0" VerticalAlignment="Stretch" TextAlignment="Left"
                                       Text="{Binding prefix}"/>
                    <TextBlock Grid.Column="1" x:Name="tblock_StatisticsRight" HorizontalAlignment="Stretch" LineHeight="20" TextWrapping="Wrap" Margin="0,0,10,0" VerticalAlignment="Stretch" TextAlignment="Right"
                                       Text="{Binding amount}"/>
                </Grid>
                <DataTemplate.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                        <Setter Property="Background" Value="Gray" TargetName="grid"/>
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter Property="Background" Value="LightGray" TargetName="grid"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>


这会让你看到彩色线条。

为什么不设置tblock_StatisticsLeft和tblock_StatisticsRight文本块的背景属性,而不是设置Run元素的背景属性?因为整个文本块都有一种颜色,而不是每一行都有一种单独的颜色,我没有搞错。后面是什么那么文本块呢?您使用的是哪种ItemsControl?您需要设置文本块后面的元素的背景属性。后面没有任何内容。XAML代码:当然,文本块背后有一些东西。请将窗口的整个XAML标记与代码一起发布。谢谢您的努力。我试过了,但没有达到我想要的效果。颜色仍然只是在文本处染色,我想整行都要染色。你说得对。它很容易修复:将背景部分设置为stackpanel的背景。我会测试它,它工作得非常完美!你知道为什么它们必须是公共属性而不能只是字段吗?不知道ItemsControl.AlternationIndex。谢谢。@Gistiv:因为您只能绑定到公共属性。
public class BackConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var index = ((ItemsControl)values[1]).Items.IndexOf(values[0]);
        if (index % 2 == 0)
            return Brushes.Gray;
        return Brushes.White; 
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    } 
}
ic.ItemsSource = GlobalSettings.prefixList;
public string prefix { get; set; }
<ScrollViewer Grid.Row="2" Grid.RowSpan="3" Grid.Column="1" Grid.ColumnSpan="2" Margin="10,35,12,12" Name="sv_PrefixList">
    <ItemsControl x:Name="ic" AlternationCount="2">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="grid">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" x:Name="tblock_StatisticsLeft" HorizontalAlignment="Stretch" LineHeight="20" TextWrapping="Wrap" Margin="0,0,0,0" VerticalAlignment="Stretch" TextAlignment="Left"
                                       Text="{Binding prefix}"/>
                    <TextBlock Grid.Column="1" x:Name="tblock_StatisticsRight" HorizontalAlignment="Stretch" LineHeight="20" TextWrapping="Wrap" Margin="0,0,10,0" VerticalAlignment="Stretch" TextAlignment="Right"
                                       Text="{Binding amount}"/>
                </Grid>
                <DataTemplate.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                        <Setter Property="Background" Value="Gray" TargetName="grid"/>
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter Property="Background" Value="LightGray" TargetName="grid"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>