2011-07-20 6 views
0

グリッドコントロールがあり、各行にスタックパネルが含まれ、各スタックパネルには1つ以上のテキストブロックが含まれますテキストブロックのカスタムグリッドを実現するためのよりよい方法 - つまり、「ヘッダラベル:コンテンツ」の行、いくつかのヒントをお寄せください)Silverlightコントロールにスタイルを適用するのは、そのコントロールが特定のスタイルの別のコントロール内にある場合のみです。

とにかく...私はスタックパネルに暗いテキストブロックには白、太字のテキストがあり、次に、それぞれの行には黒のテキストが表示されます。 Style HeaderRowで最初の行だけが定義されていることに注意してください。私は "BasedOn"を使用してヘッダー行のテキストブロックのみ太字/白でなければならないと定義しましたが、これは他の行のすべてのテキストブロックにも影響します(別のスタイルの定義はありません)。

私は効果的に

サンプルXAML

スタイルを行うことができるようにしたい:

<Style x:Key="TitleLabel" TargetType="TextBlock"> 
        <Setter Property="FontFamily" Value="Verdana"/> 
        <Setter Property="Margin" Value="5 0 0 0"/> 
        <Setter Property="Width" Value="105"/> 
        <Setter Property="FontWeight" Value="Bold"/> 
       </Style> 
       <Style x:Key="AlternatingRow" TargetType="StackPanel"> 
        <Setter Property="Background" Value="#f0f1ff"/> 
       </Style> 
       <Style x:Key="HeaderRow" TargetType="StackPanel"> 
        <Setter Property="Background" Value="#666666"/> 
       </Style> 
       <Style TargetType="TextBlock" BasedOn="StaticResource HeaderRow" > 
        <Setter Property="Foreground" Value="White"/> 
        <Setter Property="FontWeight" Value="Bold"/> 
       </Style> 

XAML

<Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="auto"/> 
         <RowDefinition Height="auto"/> 
         <RowDefinition Height="auto"/> 
         <RowDefinition Height="auto"/> 
         <RowDefinition Height="auto"/> 
         <RowDefinition Height="auto"/> 
        </Grid.RowDefinitions> 
        <StackPanel Orientation="Horizontal" Grid.Row="0" Style="{StaticResource HeaderRow}"> 
         <TextBlock Text="Header Row" /> 
        </StackPanel> 
        <StackPanel Orientation="Horizontal" Grid.Row="1" Style="{StaticResource AlternatingRow}"> 
         <TextBlock Text="HeaderLabel:" Style="{StaticResource TitleLabel}" /> 
         <TextBlock Text="Content" /> 
        </StackPanel> 
        <StackPanel Orientation="Horizontal" Grid.Row="2"> 
         <TextBlock Text="HeaderLabel" Style="{StaticResource TitleLabel}" /> 
         <TextBlock Text="Content" /> 
        </StackPanel> 
        <StackPanel Orientation="Horizontal" Grid.Row="3" Style="{StaticResource AlternatingRow}"> 
         <TextBlock Text="HeaderLabel" Style="{StaticResource TitleLabel}" /> 
         <TextBlock Text="Content" /> 
        </StackPanel> 
        <StackPanel Orientation="Horizontal" Grid.Row="4"> 
         <TextBlock Text="HeaderLabel" Style="{StaticResource TitleLabel}" /> 
         <TextBlock Text="Content" /> 
        </StackPanel> 
       </Grid> 

答えて

0

をあなたは正しくStyleBasedOnプロパティを使用していません。 1つのスタイルが別のスタイルを '拡張'していることを示しています。つまり、すべての設定値がコピーされます。 (たとえば、TargetTypesと互換性がない別のスタイルに基づいてスタイルを作成しようとしているので、この例も失敗します)。ある要素が別の要素の中に入れ子になっているときにスタイルが適用されることを示しません。

残念ながら、Silverlightには必要な機能がありません。ビジュアルツリー内の要素の位置に基づいてスタイルを設定することはできません。それぞれTextBlockを明示的にスタイルする必要があります。

http://www.scottlogic.co.uk/blog/colin/2009/03/using-css-selectors-for-styling-in-wpf/

これは、あなたが親要素に基づいてセレクタを作成することができます:

が、私は戻ってしばらくスタイリングのためのCSSを使用するためのメカニズムを作成しました。

関連する問題