Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Не могу понять как переопределять ключи в ресурсах.
Простой пример с двумя кнопками
    <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.
15 ноя 18, 14:12    [21735198]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
обычно все кисти и другие подобные ресурсы и так нужно через DynamicResource задавать.
Разница между Static и Dynamic ресурсов в том, что если Static получат\ищет значение только один раз, то Dynamic каждый раз как будет переопределен ресурс.
На уровне окна в стиле был получен StaticResource, значит, что ресурс будет найден всего 1 раз и сколько бы вы там его не переопределяли, он будет всегда таким каким был найден 1 раз.
15 ноя 18, 14:22    [21735209]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Roman Mejtes
обычно все кисти и другие подобные ресурсы и так нужно через DynamicResource задавать.
Разница между Static и Dynamic ресурсов в том, что если Static получат\ищет значение только один раз, то Dynamic каждый раз как будет переопределен ресурс.
На уровне окна в стиле был получен StaticResource, значит, что ресурс будет найден всего 1 раз и сколько бы вы там его не переопределяли, он будет всегда таким каким был найден 1 раз.

Спасибо!
Получается https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources неверная информация.
15 ноя 18, 14:41    [21735243]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Eld Hasp
Получается https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources неверная информация.
и в чем же?
15 ноя 18, 14:57    [21735275]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Shocker.Pro
Eld Hasp
Получается https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/xaml-resources неверная информация.
и в чем же?
Цитата из этого источника "В предыдущем примере когда XAML загрузчика обрабатывает значение {StaticResource MyBrush} для Background свойство Button, логика подстановки ресурсов сначала проверяет словарь ресурсов для Button элемент. Если Button нет определения ключа ресурса MyBrush...." Речь идёт, именно, о StaticResource, а он так не работает - пример из начала темы
15 ноя 18, 15:03    [21735288]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
StaticResource и DynamicResouce ищут ресурс одинаково, как вы и описали, сперва у себя, потом у родителей, потом у приложении и т.д. Поиск осуществляется с помощью метода FrameworkElement.FindResource.
Но StaticResource делает это только 1 раз в момент инициализации, а DynamicResource каждый раз когда ресурс переопределен.
Если вы в стиле указали StaticResource, то как только стиль будет загружен в память, все его статические ресурсы загрузятся 1 раз и больше обновляться не будут.
15 ноя 18, 15:10    [21735297]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Roman Mejtes
StaticResource и DynamicResouce ищут ресурс одинаково, как вы и описали, сперва у себя, потом у родителей, потом у приложении и т.д. Поиск осуществляется с помощью метода FrameworkElement.FindResource.
Но StaticResource делает это только 1 раз в момент инициализации, а DynamicResource каждый раз когда ресурс переопределен.
Если вы в стиле указали StaticResource, то как только стиль будет загружен в память, все его статические ресурсы загрузятся 1 раз и больше обновляться не будут.
А для первой кнопки, которая без стиля? Почему цвет не грузится из собственных ресурсов? Теоретически, наверное, потому, что цвет устанавливается до инициализации ресурсов кнопки. И так как ресурсов кнопки ещё нет, то он берётся из вышестоящих ресурсов.
Но тогда указанный совет из docs.microsoft всё равно - неверен.
15 ноя 18, 15:50    [21735362]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
        <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'а)
15 ноя 18, 16:14    [21735386]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Roman Mejtes
        <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 написано, что статический ресурс тоже должен подхватывается из ресурсов кнопки.
И интерес в том, что это - случайная описка? Или что-то ещё - до чего я не додумался?
15 ноя 18, 17:45    [21735497]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
Eld Hasp,

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

Вообще в статье, которую вы привели, написано:
автор
Вы можете определить ресурсы в любом элементе. Тем не менее, ресурсы, наиболее часто определяются в корневом элементе, который является Page в примере.

А еще лучше определять ресурсы в отдельном ресурсном файле, разбив их таким образом "по смыслу" и потом подключать их с помощью MergeDictionary.
Такие ресурсы как кисти, строки и прочее подключаются на уровне приложения. Так их будет проще найти, когда потребуется их изменить. А если надо будет переопределить на системном уровне, то это не составит большого труда.
15 ноя 18, 18:29    [21735549]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Roman Mejtes
eb-US
Картинка с другого сайта.
15 ноя 18, 18:35    [21735557]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Roman Mejtes
Eld Hasp,

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

Вообще в статье, которую вы привели, написано:
автор
Вы можете определить ресурсы в любом элементе. Тем не менее, ресурсы, наиболее часто определяются в корневом элементе, который является Page в примере.

А еще лучше определять ресурсы в отдельном ресурсном файле, разбив их таким образом "по смыслу" и потом подключать их с помощью MergeDictionary.
Такие ресурсы как кисти, строки и прочее подключаются на уровне приложения. Так их будет проще найти, когда потребуется их изменить. А если надо будет переопределить на системном уровне, то это не составит большого труда.

Всё понятно. Спасибо!
15 ноя 18, 19:10    [21735604]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Roman Mejtes
Eld 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 - официальной документацией? И даже официальная не застрахована от ошибок. Все люди - все ошибаются.
15 ноя 18, 19:15    [21735612]     Ответить | Цитировать Сообщить модератору
 Re: Переопределение ключей в ресурсах  [new]
Eld Hasp
Member

Откуда:
Сообщений: 225
Все варианты подключения ресурсов
1) Статик в привязке свойства
2) Статик в привязке в стиле
3) Динамик в привязке свойства
4) Динамик в привязке в стиле
    <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>


К сообщению приложен файл. Размер - 8Kb
15 ноя 18, 19:21    [21735624]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить