powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Переопределение ключей в ресурсах
14 сообщений из 14, страница 1 из 1
Переопределение ключей в ресурсах
    #39733524
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять как переопределять ключи в ресурсах.
Простой пример с двумя кнопками
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    <Window.Resources>
        <SolidColorBrush x:Key="Button.Background" Color="LightCoral"/>
        <Style TargetType="Button" x:Key="StyleButton">
            <Setter Property="Background" Value="{StaticResource Button.Background}"/>
        </Style>
    </Window.Resources>
    <StackPanel>
        <StackPanel.Resources>
            <SolidColorBrush x:Key="Button.Background" Color="LightBlue"/>
        </StackPanel.Resources>
        <Button Background="{StaticResource Button.Background}" Content="Первая кнопка">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>
        <Button  Content="Вторая кнопка" Style="{StaticResource StyleButton}">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>
    </StackPanel>


Судя по https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources, ключ ищется сначала в ресурсах элемента и потом поиск подымается по логическому дереву. В таком случае у обоих кнопок должен быть цвет LightGreen, но выходит не так.
У первой кнопки цвет берётся из ресурсов панели - LightBlue
У второй кнопки с цветом через стиль из ресурсов окна - LightCoral

Что здесь не так? Я что-то не так делая или описание поиска ключа не верное?

Да, можно поставить DynamicResource и тогда будет работать как задумано. Так делать правильно?
И в указанной странице пишется всё же за StaticResource.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733533
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычно все кисти и другие подобные ресурсы и так нужно через DynamicResource задавать.
Разница между Static и Dynamic ресурсов в том, что если Static получат\ищет значение только один раз, то Dynamic каждый раз как будет переопределен ресурс.
На уровне окна в стиле был получен StaticResource, значит, что ресурс будет найден всего 1 раз и сколько бы вы там его не переопределяли, он будет всегда таким каким был найден 1 раз.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733552
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesобычно все кисти и другие подобные ресурсы и так нужно через DynamicResource задавать.
Разница между Static и Dynamic ресурсов в том, что если Static получат\ищет значение только один раз, то Dynamic каждый раз как будет переопределен ресурс.
На уровне окна в стиле был получен StaticResource, значит, что ресурс будет найден всего 1 раз и сколько бы вы там его не переопределяли, он будет всегда таким каким был найден 1 раз.
Спасибо!
Получается https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources неверная информация.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733570
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspПолучается https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources неверная информация.и в чем же?
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733579
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspПолучается https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources неверная информация.и в чем же?Цитата из этого источника "В предыдущем примере когда XAML загрузчика обрабатывает значение { StaticResource MyBrush} для Background свойство Button, логика подстановки ресурсов сначала проверяет словарь ресурсов для Button элемент. Если Button нет определения ключа ресурса MyBrush...." Речь идёт, именно, о StaticResource, а он так не работает - пример из начала темы
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733584
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaticResource и DynamicResouce ищут ресурс одинаково, как вы и описали, сперва у себя, потом у родителей, потом у приложении и т.д. Поиск осуществляется с помощью метода FrameworkElement.FindResource.
Но StaticResource делает это только 1 раз в момент инициализации, а DynamicResource каждый раз когда ресурс переопределен.
Если вы в стиле указали StaticResource, то как только стиль будет загружен в память, все его статические ресурсы загрузятся 1 раз и больше обновляться не будут.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733619
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesStaticResource и DynamicResouce ищут ресурс одинаково, как вы и описали, сперва у себя, потом у родителей, потом у приложении и т.д. Поиск осуществляется с помощью метода FrameworkElement.FindResource.
Но StaticResource делает это только 1 раз в момент инициализации, а DynamicResource каждый раз когда ресурс переопределен.
Если вы в стиле указали StaticResource, то как только стиль будет загружен в память, все его статические ресурсы загрузятся 1 раз и больше обновляться не будут.А для первой кнопки, которая без стиля? Почему цвет не грузится из собственных ресурсов? Теоретически, наверное, потому, что цвет устанавливается до инициализации ресурсов кнопки. И так как ресурсов кнопки ещё нет, то он берётся из вышестоящих ресурсов.
Но тогда указанный совет из docs.microsoft всё равно - неверен.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733638
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
        <Button  Content="Вторая кнопка" Style="{StaticResource StyleButton}">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>


<SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>

будет действовать только для содержимого кнопки, на саму кнопку действовать не будет.
нельзя определить ресурс в элементе управления и использовать его в нём же.
Но такой вариант, который вы указали сработает, если вы переопределяете ресурсы шаблона элемента управления. (ControlTemplate'а)
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733720
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
Код: xml
1.
2.
3.
4.
5.
        <Button  Content="Вторая кнопка" Style="{StaticResource StyleButton}">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>


<SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>

будет действовать только для содержимого кнопки, на саму кнопку действовать не будет.
нельзя определить ресурс в элементе управления и использовать его в нём же.
Но такой вариант, который вы указали сработает, если вы переопределяете ресурсы шаблона элемента управления. (ControlTemplate'а)
Если делать делать ссылку на динамический ресурс, то он подхватывается и из ресурсов кнопки. Если статический , то только из вышестоящих ресурсов. Я в этом разобрался - Спасибо.
Но речь немного о другом - в docs.microsoft написано, что статический ресурс тоже должен подхватывается из ресурсов кнопки.
И интерес в том, что это - случайная описка? Или что-то ещё - до чего я не додумался?
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733750
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,

в MSDN полно ошибок, особенно если брать переводы и не только машинные.
Не так давно, кидал ссылку на такой пример. В eb-US версии написано одно, а в ru-RU наоборот :)

Вообще в статье, которую вы привели, написано:
авторВы можете определить ресурсы в любом элементе. Тем не менее, ресурсы, наиболее часто определяются в корневом элементе, который является Page в примере.
А еще лучше определять ресурсы в отдельном ресурсном файле, разбив их таким образом "по смыслу" и потом подключать их с помощью MergeDictionary.
Такие ресурсы как кисти, строки и прочее подключаются на уровне приложения. Так их будет проще найти, когда потребуется их изменить. А если надо будет переопределить на системном уровне, то это не составит большого труда.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733756
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejteseb-US
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733775
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesEld Hasp,

в MSDN полно ошибок, особенно если брать переводы и не только машинные.
Не так давно, кидал ссылку на такой пример. В eb-US версии написано одно, а в ru-RU наоборот :)

Вообще в статье, которую вы привели, написано:
авторВы можете определить ресурсы в любом элементе. Тем не менее, ресурсы, наиболее часто определяются в корневом элементе, который является Page в примере.
А еще лучше определять ресурсы в отдельном ресурсном файле, разбив их таким образом "по смыслу" и потом подключать их с помощью MergeDictionary.
Такие ресурсы как кисти, строки и прочее подключаются на уровне приложения. Так их будет проще найти, когда потребуется их изменить. А если надо будет переопределить на системном уровне, то это не составит большого труда.
Всё понятно. Спасибо!
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733779
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesEld Hasp,

в MSDN полно ошибок, особенно если брать переводы и не только машинные.
Не так давно, кидал ссылку на такой пример. В eb-US версии написано одно, а в ru-RU наоборот :)

Вообще в статье, которую вы привели, написано:
авторВы можете определить ресурсы в любом элементе. Тем не менее, ресурсы, наиболее часто определяются в корневом элементе, который является Page в примере.
English : "In the preceding example, when the XAML loader processes the value {StaticResource MyBrush} for the Background property on Button, the resource lookup logic first checks the resource dictionary for the Button element. If Button does not have a definition of the resource key MyBrush ...." - ошибка в оригинале, а не в переводе. Перевод правильный.
Но, насколько верно считать docs.microsoft - официальной документацией? И даже официальная не застрахована от ошибок. Все люди - все ошибаются.
...
Рейтинг: 0 / 0
Переопределение ключей в ресурсах
    #39733787
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все варианты подключения ресурсов
1) Статик в привязке свойства
2) Статик в привязке в стиле
3) Динамик в привязке свойства
4) Динамик в привязке в стиле
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    <Window.Resources>
        <Style TargetType="Button">
            <Setter Property="Margin" Value="5"/>
        </Style>
        <SolidColorBrush x:Key="Button.Background" Color="LightCoral"/>
        <Style TargetType="Button" x:Key="StyleButton">
            <Setter Property="Background" Value="{StaticResource Button.Background}"/>
            <Setter Property="Margin" Value="5"/>
        </Style>
        <Style TargetType="Button" x:Key="StyleButtonDyn">
            <Setter Property="Background" Value="{DynamicResource Button.Background}"/>
            <Setter Property="Margin" Value="5"/>
        </Style>
    </Window.Resources>
    <StackPanel>
        <StackPanel.Resources>
            <SolidColorBrush x:Key="Button.Background" Color="LightBlue"/>
        </StackPanel.Resources>
        <Button Background="{StaticResource Button.Background}" Content="Первая кнопка">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>
        <Button  Content="Вторая кнопка" Style="{StaticResource StyleButton}">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>
        <Button Background="{DynamicResource Button.Background}" Content="Третья кнопка">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>
        <Button  Content="Четвёртая кнопка" Style="{StaticResource StyleButtonDyn}">
            <Button.Resources>
                <SolidColorBrush x:Key="Button.Background" Color="LightGreen"/>
            </Button.Resources>
        </Button>
    </StackPanel>
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Переопределение ключей в ресурсах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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