powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как задать разные стили для элемента UI для разных тем Windows
19 сообщений из 19, страница 1 из 1
Как задать разные стили для элемента UI для разных тем Windows
    #38783643
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь для разных тем винды задать разные стили для кнопки. Как я понимаю, WPF умеет автоматически использовать темы (Aero.NormalColor.xaml, Classic.xaml и прочие), в зависимости от текущей тема винды.

XAML окна

Код: xml
1.
2.
3.
4.
5.
6.
<Grid>
    <Button Grid.Row="0" 
            Name="_first" 
            Content="Fisrt">
    </Button>
</Grid>



Aero.NormalColor.xaml

Код: xml
1.
2.
3.
<Style TargetType="{x:Type ButtonBase}">
        <Setter Property="Background" Value="Red"/>
</Style>



Classic.xaml

Код: xml
1.
2.
3.
<Style TargetType="{x:Type ButtonBase}">
        <Setter Property="Background" Value="Violet"/>
</Style>



В свойствах сборки указал.

Код: c#
1.
2.
[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly,
                     ResourceDictionaryLocation.SourceAssembly)]



Ожидаю, что при выборе классической темы кнопка будет цвета Violet , а при выборе темы аэро - Red . Однако, кнопка все время дефолтного серого цвета. Как сделать?
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38783662
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrillaПытаюсь для разных тем винды задать разные стили для кнопки.Зачем? За это платят отдельно?
monstrillaКак я понимаю, WPF умеет автоматически использовать темы (Aero.NormalColor.xaml, Classic.xaml и прочие), в зависимости от текущей тема винды. Да
авторEvery Control in WPF has a default Style that provides, among other things, the Control's default ControlTemplate. WPF looks for the default style in a special resource dictionary in the Themes folder in the same assembly as the control. The key for the default style is provided by the Control.DefaultStyleKey dependency property, the default value of which is overriden in each sub-class of Control.

The name of the resource dictionary depends on the current Windows theme e.g. on Vista using the Aero theme, the dictionary is called Aero.NormalColor.xaml, on XP using the default theme it is Luna.NormalColor.xaml. If the style is not found in the theme dictionary, it looks in Generic.xaml i.e for controls whose look doesn't depend on the theme.

This only applies to any custom controls you have defined i.e. classes derived from Control, directly or indirectly. You can change the default style for a standard control by deriving from it and calling DefaultStyleKeyProperty.OverrideMetadata in the static constructor, but you then have to supply the full style including ControlTemplate.

Note that you can tell WPF to look in an external assembly for your default style by using the ThemeInfo attribute. The external assembly must be named <YourAssembly>.<ThemeName>.dll e.g. PresententationFramework.Aero.dll.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38783666
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,
авторЗа это платят отдельно?

платят, платят. без создания класса-наследника кнопки не обойтись что ли?
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38783670
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrillaАлексей К,
авторЗа это платят отдельно?

платят, платят. без создания класса-наследника кнопки не обойтись что ли?Если переопределение стиля на уровне ресурсов Application не устраивает, тогда не обойтись.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38783674
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы: Ресурсы приложения можно менять программно при запуске, в зависимости от окружения.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38783677
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

я в курсе как подменить ресурс динамически. правда пока не знаю, как определить текущую тему винды, но это детали. это не тру-подход, в том смысле, что при смене темы винды в процессе работы приложения, стили приложения не сменятся до его перезапуска.

и мне все-таки хочется использовать нативную способность ВПФ использовать разные словари для разных тем винды, а не менять словарь ручками.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38783713
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrillaи мне все-таки хочется использовать нативную способность ВПФ использовать разные словари для разных тем винды, а не менять словарь ручками.Тогда придётся наследовать.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38785913
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Чот не получается :Е

Кнопка-наследник:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<Button x:Class="TestProjectTheme.ImageButton"
             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:TestProjectTheme="clr-namespace:TestProjectTheme"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
</Button>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
namespace TestProjectTheme
{
    /// <summary>
    /// Interaction logic for ImageButton.xaml
    /// </summary>
    public partial class ImageButton : Button
    {
        public ImageButton()
        {
            InitializeComponent();
        }
    }
}



Главное окно:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Window x:Class="TestProjectTheme.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Local="clr-namespace:TestProjectTheme"
        Title="MainWindow" 
        Height="350" 
        Width="525">
    <Grid>
        <Local:ImageButton Content="TestButton" Width="100" Height="100">
            
        </Local:ImageButton>    
    </Grid>
</Window>



Aero.NormalColor.xaml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<Style TargetType="{x:Type Local:ImageButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Local:ImageButton}">
                    <Border Name="buttonBorder"
                            BorderBrush="Aquamarine"
                            BorderThickness="5">
                        <ContentPresenter
                                  Margin="{TemplateBinding Padding}"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  RecognizesAccessKey="True"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>



generic.xaml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<Style TargetType="{x:Type Local:ImageButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Local:ImageButton}">
                    <Border
                            x:Name="Border"
                            BorderThickness="10"
                            Background="Red"
                            BorderBrush="Transparent"
                            CornerRadius="3">
                        <ContentPresenter
                                  Margin="{TemplateBinding Padding}"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  RecognizesAccessKey="True"/>
                    </Border>
                    
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>



А кнопка все время серая, игнорит стили что в теме аэро, что в классической (тут за неимением файла Classic.xaml WPF по идее должен тянуть стиль из generic.xaml ). Что делаю не так?
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38785943
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не проще было сделать так:

public class MyButton : Button {}
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786251
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public partial class ImageButton : Button
{
    static ImageButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(ImageButton),
            new FrameworkPropertyMetadata(typeof(ImageButton))
        );
    }
}
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786420
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

ну так я вроде так и отнаследовался. или имеешь ввиду без кзамл-файла? пробовал, тоже не вышло

Алексей К

еххх, совсем забыл про это. заработало :)

тогда вопрос номер два. я хочу, чтобы стили применялись не ко всем кнопкам ImageButton , т.е. по сути хочу стандартно задать ключ для стиля и прикреплять стиль к кнопке по ключу. но ведь в MainWindow нет ссылки на ресурс (он теперь динамически мержится ВПФ-ом).

Т.е. такого нет

Код: xml
1.
2.
3.
<ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/Styles/Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>




Как быть? Я, конечно могу использовать в проекте обычные кнопки + кнопки ImageButton , для обычных стиль не будет меняться при смене темы винды, для ImageButton будет. Но хочется понять возможно ли в принципе использовать ключ ресурса?
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786448
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrillaя хочу, чтобы стили применялись не ко всем кнопкам ImageButton , т.е. по сути хочу стандартно задать ключ для стиля и прикреплять стиль к кнопке по ключу. но ведь в MainWindow нет ссылки на ресурс (он теперь динамически мержится ВПФ-ом).Указать стиль явно через свойство Style? Или я не понял вопроса...

зы: Обратить внимание на свойство FrameworkElement.OverridesDefaultStyle Property .
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786460
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Код: xml
1.
2.
<ImageButton Style="{StaticResource ToolBarButtonBaseStyle}">
</ImageButton>



да, чтоб можно было сделать так. ToolBarButtonBaseStyle - ключ стиля, который определен в Aero.NormalColor.xaml к примеру.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786524
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При OverridesDefaultStyle=False (по дефолту так) явно указанные стили автоматически наследуются от стилей текущей системной темы.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786640
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

ты не понял, распишу. забудем сейчас про то, что меняются темы винды. возьмем классическую работу со стилями. т.е. есть словарь ресурсов, в нем определен стиль для кнопки + в стиле указан ключ.

Cannot find resource named 'MyStyle'. Resource names are case sensitive.

<Style TargetType="{x:Type Local:ImageButton}" x:Key="MyStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Local:ImageButton}">
// бла-бла, не суть что
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

Теперь я могу использовать этот стиль везде, где подключен словарь ресурсов, да хоть в MainWindow.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/Styles/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>


<Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Local:ImageButton Grid.Row="0" 
                           Content="CommonStyle" 
                           Width="100" 
                           Height="100"/>

        <Local:ImageButton Grid.Row="1" 
                           Content="KeyedStyle" 
                           Width="100" 
                           Height="100" 
                           Style="{StaticResource MyStyle}"/>
</Grid>



То есть могу добавлять в грид как кнопки использующие стиль, так и кнопки со стилем по умолчанию.

А теперь возвращаемся к задаче со сменой тем винды. Я хочу иметь возможность добавлять кнопки, стиль которых будет меняться в зависимости от темы винды и будет браться из словарей (Aero.NormalColor, Classic и прочие) это мы уже умеем делать. А так же иметь возможность добавлять кнопки, которые будут игнорировать стили из этих словарей (Aero.NormalColor, Classic и прочие), а будут юзать дефолтные стили для этих тем. Т.е. кнопки, которые используют стиль по ключу - получают свои стили из словарей (Aero.NormalColor, Classic и проч), а те, которые не используют стиль, получают дефолтные стили для этих тем. Вроде понятно написал. Это реально сделать?

или

Код: c#
1.
2.
3.
4.
DefaultStyleKeyProperty.OverrideMetadata(
            typeof(ImageButton),
            new FrameworkPropertyMetadata(typeof(ImageButton))
        );



рубит на корню мои мечты?
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786644
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

отформатировал пост.

ты не понял, распишу. забудем сейчас про то, что меняются темы винды. возьмем классическую работу со стилями. т.е. есть словарь ресурсов, в нем определен стиль для кнопки + в стиле указан ключ.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<Style TargetType="{x:Type Local:ImageButton}" x:Key="MyStyle">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Local:ImageButton}">
            // бла-бла, не суть что
        </ControlTemplate>
    </Setter.Value>
</Setter>
</Style>



Теперь я могу использовать этот стиль везде, где подключен словарь ресурсов, да хоть в MainWindow.

Код: xml
1.
2.
3.
<ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/Styles/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>




Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Local:ImageButton Grid.Row="0" 
                           Content="CommonStyle" 
                           Width="100" 
                           Height="100"/>

        <Local:ImageButton Grid.Row="1" 
                           Content="KeyedStyle" 
                           Width="100" 
                           Height="100" 
                           Style="{StaticResource MyStyle}"/>
</Grid>





То есть могу добавлять в грид как кнопки использующие стиль, так и кнопки со стилем по умолчанию.

А теперь возвращаемся к задаче со сменой тем винды. Я хочу иметь возможность добавлять кнопки, стиль которых будет меняться в зависимости от темы винды и будет браться из словарей (Aero.NormalColor, Classic и прочие) это мы уже умеем делать. А так же иметь возможность добавлять кнопки, которые будут игнорировать стили из этих словарей (Aero.NormalColor, Classic и прочие), а будут юзать дефолтные стили для этих тем. Т.е. кнопки, которые используют стиль по ключу - получают свои стили из словарей (Aero.NormalColor, Classic и проч), а те, которые не используют стиль, получают дефолтные стили для этих тем. Вроде понятно написал. Это реально сделать?

или

Код: c#
1.
2.
3.
4.
DefaultStyleKeyProperty.OverrideMetadata(
            typeof(ImageButton),
            new FrameworkPropertyMetadata(typeof(ImageButton))
        );





рубит на корню мои мечты?
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786864
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я запутался. :-)

Может позже ещё раз прочитаю, пойму...

Пока могу добавить, что есть возможность наследования стилей. Может это чем-то поможет:
Код: xml
1.
2.
<Style TargetType="{x:Type my:ImageButton}"
           BasedOn="{StaticResource {x:Type Button}}">

В результате стиль темы для ImageButton наследуется от стиля темы для Button.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38786872
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, раз такие сложности, может подумать о применении композиции вместо наследования? В случае с ImageButton, если это то, о чём я подумал - я делал такой контрол и вставлял его в стандартную кнопку.
...
Рейтинг: 0 / 0
Как задать разные стили для элемента UI для разных тем Windows
    #38787900
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

сложностей нет. я просто пытался понять концепцию. ну я уже сам вроде разобрался :) те стили, что указываются в словарях (Аэро, Классик) становятся дефолтными для соответствующих тем. при желании можно эти стили перекрывать другими стилями. Т.е. определяем словарь со стилями, стили с ключами. Мержим словарь и используем стили по ключу.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как задать разные стили для элемента UI для разных тем Windows
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]