Как я могу основать стиль на теме набора инструментов Silverlight? - PullRequest
0 голосов
/ 13 апреля 2011

возможно ли это сделать?

В моем коде xaml у меня есть несколько комбинированных списков со стилем, определенным так:

<Style x:Key="comboProjectsStyle"
       TargetType="ComboBox">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="{Binding Path=Name}"
                               FontSize="14" />
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="comboDataSourcesStyle"
       TargetType="ComboBox">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="{Binding Path=DescriptiveName}"
                               FontSize="14" />
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
<ComboBox Width="300"
          Style="{StaticResource comboProjectsStyle}" />
<ComboBox Width="300"
          Style="{StaticResource comboDataSourcesStyle}" />

Тема silverlight (например, ExpressionDark)правильно применяется ко всем элементам управления, кроме тех, где я определил стиль, как описано выше.

Как я понимаю, в WPF мы могли бы использовать x: Style для нашего стиля на основе темы silverlight, используя "BasedOn"" имущество.Тем не менее, кажется, что это невозможно сделать с Silverlight 4.

Есть идеи, как к этому подойти?

Спасибо!

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Объявите ваш ItemTemplate как ресурс, а не как стиль, тогда ваш стиль темы будет применяться.

<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="Silverlight_Spike.MainPage"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid>
                <TextBlock Text="{Binding Name}" FontSize="14" />
            </Grid>
        </DataTemplate>
    </UserControl.Resources>

    <ComboBox ItemTemplate="{StaticResource DataTemplate1}" />

</UserControl>
0 голосов
/ 20 сентября 2011

Привет, это не совсем с использованием basedOn, но с помощью конвертера мы можем достичь цели, основывая свой стиль на теме. Вот как мы это делаем.

  1. Выставьте тему и поместите ее там, где вы можете привязать ее к стилю.

  2. Создайте конвертер значений для преобразования используемого вами стиля. Этот конвертер вернет стиль, основанный на теме, так что вот фрагмент кода.

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter is Style)
        {
            Style retStyle = parameter as Style;
            Theme themeContainer;
            if (value is Theme)
                themeContainer = value as Theme; //(App.Current as App).AppTheme;
            else
                themeContainer = (App.Current as App).AppTheme; 
    
            if (themeContainer != null)
            {
                foreach (DictionaryEntry i in themeContainer.ThemeResources)
                {
                    if (i.Value is Style)
                    {
                        Style t = i.Value as Style;
                        if (t.TargetType == retStyle.TargetType)
                        {
                            Style newStyle = new Style();
                            newStyle.TargetType = retStyle.TargetType;
                            newStyle.BasedOn = t;
    
                            foreach (Setter set in retStyle.Setters)
                                newStyle.Setters.Add(new Setter() { Property = set.Property, Value = set.Value }); 
    
                            return newStyle;                                              
                        }
                    }
                }
            }
            return retStyle;
        }
        return null; 
    }
    
  3. Свяжите тему со стилем и используйте конвертер для каждого пользовательского стиля, который вы используете

    Style = "{Binding Theme, Converter = {StaticResource styleConverter}, ConverterParameter = {StaticResource ButtonStyle1}}" "1016 *

Где тема - это свойство типа Theme (System.Windows.Controls.Theming).

Я скачал свой пример проекта здесь Пример кода не обновляется, но вы можете начать с него.

0 голосов
/ 13 апреля 2011

Удалите ключ в стиле:

    <Style TargetType="ComboBox">
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Grid>
                                <TextBlock Text="{Binding Path=Name}" FontSize="14" />
                            </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
        </Style>
    <Style x:Key="comboProjectsStyle" TargetType="ComboBox">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Grid>
                            <TextBlock Text="{Binding Path=Name}" FontSize="14" />
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
    </Style>

    <Style x:Key="comboDataSourcesStyle" TargetType="ComboBox">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Grid>
                            <TextBlock Text="{Binding Path=DescriptiveName}" FontSize="14" />
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
    </Style>

    <ComboBox Width="300" Style="{StaticResource comboProjectsStyle}" />
    <ComboBox Width="300" Style="{StaticResource comboDataSourcesStyle}" />

<ComboBox Width="300" />
<ComboBox Width="300" />
<ComboBox Width="300" />

В основном это означает, что стиль, который вы создали выше, применяется к целевому типу ComboBox, он не назван, поэтому каждый Combobox без установленного ему стиля будет наследоватьэто по умолчанию.

ОБНОВЛЕНИЕ: Как вы можете видеть, все 3 стиля могут сосуществовать в одном ресурсе, всякий раз, когда вы используете именованный стиль, он будет применен к указанному элементу управления, но дляпоследние три выпадающих списка, все 3 будут иметь стиль без ключа.Вот как это делается в темах, как в скине JetPack от MS.

надеюсь, это поможет.

...