Применять стиль к элементу управления Silverlight, только если этот элемент управления находится внутри другого элемента управления с определенным стилем - PullRequest
0 голосов
/ 20 июля 2011

У меня есть элемент управления Grid, в котором каждая строка содержит стековую панель, а каждая стековая панель содержит один или несколько текстовых блоков (хотя это и не является ключевым вопросом, если есть лучший способ создать пользовательскую сетку текстовых блоков - то есть строк заголовка ") label: content ", буду признателен за некоторые советы)

В любом случае ... Я хочу иметь строку заголовка, где панель стека имеет темный фон, а текстовый блок имеет белый жирный текст, а затем в каждой строке будет черный текст. Обратите внимание, что только первая строка определяется с помощью 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>

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

1 Ответ

0 голосов
/ 20 июля 2011

Вы неправильно используете свойство Style BasedOn.Все, что он делает, это указывает, что один стиль «расширяет» другой, то есть он копирует все свои установочные значения.(Обратите внимание, что ваш пример также потерпит неудачу, потому что вы пытаетесь основывать стиль на другом, где TargetTypes несовместимы) Это не означает, что стиль применяется, когда один элемент вложен в другой.

К сожалению, в Silverlight нет нужной вам функции, вы не можете использовать стили в зависимости от расположения элементов в визуальном дереве.Вам придется явно стилизовать каждый TextBlock.

Хотя я и создал механизм для использования CSS для стилизации некоторое время назад:

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

Это позволяет создавать селекторы на основе родительских элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...