2017-02-07 6 views
1

私のWPFアプリケーションでは、2つのテキストブロックがあります。すべての2行目の背景色が異なるため、読みやすくなります。残念ながら、線は書かれている限り染色されます。しかし、私はバックグラウンドカラーが書かれたエリアだけでなくライン全体に行きたいと思っています。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

それは、単一のテキストブロック内の1行であるようにそれが見えるように、2つのテキストブロックが途中でシームレスに一緒にされています。これが簡単な場合は、行間のスペースは無視できます。

テキストボックスやリッチテキストボックスを使用しないで解決策がありますか?

EDIT:

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> 

私は関係ありませんコントロールの他のすべてのものを残しました。ここで

+0

Run要素のBackgroundプロパティを設定する代わりに、tblock_StatisticsLeftおよびtblock_StatisticsRight TextBlocksのBackgroundプロパティを設定しないのはなぜですか? – mm8

+0

私は間違いではないので、テキストブロック全体が単一の色を持ち、すべての単一の行に別々の色がないからです。 – Gistiv

+0

その後、TextBlockの背後には何がありますか?どのようなItemsControlを使用していますか? TextBlocksの背後にある要素のbackgroundプロパティを設定する必要があります。 – mm8

答えて

1

あなたは可能性があり(必要があります)を使用する。 、あなたのGlobalSettings.prefixListコレクションにのItemsSourceプロパティを設定しますが、これでループのためにあなたを置き換える例:

ic.ItemsSource = GlobalSettings.prefixList; 

「接頭辞」と「量」は、公開プロパティ(とされていないフィールド)であることを確認してください、あなたの "の接頭辞」タイプまたは何でもあなたはそれを呼び出す:

public string prefix { get; set; } 

あなたはその後、ItemsControlItemTemplateにテキストブロックでGridを入れて、にテキストブロックを結合し、 『接頭辞』と 『量』プロパティ:

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

これは色付きの線を得るはずです。

+0

あなたの努力に感謝します。私はそれをすぐに試してみます – Gistiv

+0

私はそれをテストし、それは完璧に動作します!なぜ彼らは公共の財産でなければならず、単に畑になることができないのか知っていますか? – Gistiv

+0

_ItemsControl.AlternationIndex_について知りませんでした。ありがとう。 – Ron

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#コード:

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

あなたのeffordをありがとう。私はそれを試しましたが、私が望む結果を私に与えませんでした。色はまだテキストがあるところでちょうど染められ、私は染められた全体の線にしたいです。 – Gistiv

+0

あなたは正しいです。それは簡単に修正されます:背景部分をスタックパネルの背景として設定します。 – Ron

+0

編集を参照してください。それが動作していない場合私に知らせてください。 – Ron

関連する問題