2017-02-07 5 views
1

In meiner WPF-Anwendung habe ich zwei Textblöcke, die aus dem Code dahinter mit einem Lauf gefüllt werden. Jede zweite Zeile sollte eine andere Hintergrundfarbe haben, damit sie leichter zu lesen ist. Leider sind die Zeilen nur so weit gefärbt, wie sie geschrieben sind. Aber ich möchte, dass die Hintergrundfarbe über die gesamte Zeile und nicht nur über den geschriebenen Bereich hinausgeht.WPF - Ändern der Farbe einer ganzen Textblockzeile

Code:

  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

Die beiden Textblöcke sind in der Mitte nahtlos zusammen, so dass es aussehen würde, wie es eine einzelne Zeile in einem einzigen Textblock ist. Die Abstände zwischen den Linien sind vernachlässigbar, wenn dies leichter ist.

Gibt es eine Lösung ohne Verwendung einer Textbox oder Richtextbox?

EDIT:

XAML-Code:

<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> 

ich links aus all den anderen Sachen der Kontrolle, die nicht relevant ist. Hier

+0

Warum legen Sie nicht die Background-Eigenschaft der Textblöcke tblock_StatisticsLeft und tblock_StatisticsRight fest, statt die Background-Eigenschaft der Run-Elemente zu setzen? – mm8

+0

Da der ganze Textblock eine einzige Farbe hat und nicht für jede einzelne Zeile eine eigene Farbe hat, da ich mich nicht irre. – Gistiv

+0

Was steht dann hinter den TextBlocks? Welche Art von ItemsControl verwenden Sie? Sie müssen die Hintergrundeigenschaft des Elements festlegen, das hinter den TextBlocks angezeigt wird. – mm8

Antwort

1

Sie könnte (sollte) Verwenden Sie eine ItemsControl. Stellen Sie die ItemsSource Eigenschaft es zu GlobalSettings.prefixList Sammlung, dh Sie können Ihre for-Schleife mit diesem ersetzen:

ic.ItemsSource = GlobalSettings.prefixList; 

Stellen Sie sicher, dass „prefix“ und „Menge“ sind öffentliche Eigenschaften (und nicht die Felder) Ihrer " Präfix“Typ oder was auch immer Sie es nennen:

public string prefix { get; set; } 

Sie dann setzen die Grid mit den Textblöcken in den ItemTemplate der ItemsControl und binden die Textblocks auf den‚Präfix‘und‚Menge‘Eigenschaften:

<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> 

Dies sollte Sie farbige Linien bekommen.

+0

danke für deine Mühe Ich werde es so schnell wie möglich versuchen – Gistiv

+0

Ich werde es getestet und es funktioniert perfekt! Weißt du, warum sie öffentliche Objekte sein müssen und nicht nur Felder sein können? – Gistiv

+0

Wusste nicht über _ItemsControl.AlternationIndex_. Vielen Dank. – Ron

0

ist der richtige Weg, dies zu tun:

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# -Code:

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; 

    } 

der Konverter:

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

Danke für Ihren Erfolg. Ich habe es versucht, aber es gab mir nicht das Ergebnis, das ich wollte. Die Farbe wird immer noch nur dort eingefärbt wo der Text ist und ich möchte die gesamte Zeile färben lassen. – Gistiv

+0

Sie haben Recht. Es behebt leicht: Stellen Sie den Hintergrundteil als Hintergrund des Stackpanels ein. – Ron

+0

siehe Bearbeiten. lass es mich wissen, wenn es nicht funktioniert. – Ron

Verwandte Themen