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

时间:2017-02-07 10:56:17

标签: c# wpf

在我的WPF应用程序中,我有两个文本块,可以通过运行从后面的代码中填充。每隔一行应具有不同的背景颜色,以便更容易阅读。不幸的是,这些线条只是在它们被写入时被染色。但我希望背景颜色遍及整条线而不仅仅是书面区域。

代码:

         for (int i = 0; i < GlobalSettings.prefixList.Count; i++)
         {
            runLeft = new Run(GlobalSettings.prefixList[i].prefix + "\n");
            runRight = new Run(GlobalSettings.prefixList[i].amount + "\n");

            if (i % 2 == 0)
            {
                runLeft.Background = Brushes.Gray;
                runRight.Background = Brushes.Gray;
            }
            else
            {
                runLeft.Background = Brushes.LightGray;
                runRight.Background = Brushes.LightGray;
            }

            tblock_StatisticsLeft.Inlines.Add(runLeft);
            tblock_StatisticsRight.Inlines.Add(runRight);
         }

Example Picture

这两个文本块在中间无缝拼接,因此它看起来像是单个文本块中的单行。如果这使得它更容易,则线之间的空间可以忽略不计。

是否有不使用文本框或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>

我遗漏了与控制无关的所有其他内容。

2 个答案:

答案 0 :(得分:1)

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

ic.ItemsSource = GlobalSettings.prefixList;

确保&#34;前缀&#34;和&#34;金额&#34;是&#34;前缀&#34;的公共属性(而不是字段)类型或任何你称之为:

public string prefix { get; set; }

然后将带有TextBlocks的Grid放在ItemTemplate的{​​{1}}中,并将TextBlocks绑定到&#34;前缀&#34;和&#34;金额&#34;属性:

ItemsControl

这可以让你获得彩色线条。

答案 1 :(得分:0)

这是正确的方法:

的Xaml:

 <Window.Resources>
    <local:BackConverter x:Key="BackConverter"/>
</Window.Resources>
<Grid Margin="10">
    <ItemsControl Name="ic"> 
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <DockPanel LastChildFill="False">
               <DockPanel.Background>
                            <MultiBinding Converter="{StaticResource BackConverter}">
                                <Binding />
                                <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}"/>
                            </MultiBinding>
                        </DockPanel.Background>
                    <TextBlock DockPanel.Dock="Left" Text="{Binding Left}">
                    </TextBlock>
                    <TextBlock DockPanel.Dock="Right" Text="{Binding Right}">
                    </TextBlock>
                </DockPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

c#c​​ode:

  public class obj
    {
        public string Left { get; set; }
        public string Right { get; set; }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        List<obj> objects = new List<obj>();
        for (int i = 0; i < 10; i++)
        {
            var left = "aaaaa";
            var right = "bbbbb";
            objects.Add(new obj() { Left = left, Right = right }); 
        }
        ic.ItemsSource = objects;

    }

转换器:

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();
    } 
}