Использование свойства стиля BasedOn в DynamicResources
Интересно, есть ли способ использовать свойство basedOn стилей wpf с динамическими ресурсами. например
<Style BasedOn="{DynamicResource somestyle}">
<Setter Property="SomeProp" Value="SomeValue"/>
</Style>
это, например, вызывает ошибку, указывающую на то, что использование динамических ресурсов в сочетании со стилями на основе базового типа невозможно. интересно, как кто-то мог это сделать? Благодарность
Ответов (2)2
Думаю, основная причина - опломбированные объекты. Если у вас есть иерархия стилей:
Style A
/ \
Style A1 Style A2
это может быть не сложный сценарий. Вы имеете в виду , StyleA
используя динамический ресурс, поэтому всякий раз , когда этот ресурс меняется, Style A1
и Style A2
следует изменить их BasedOn
свойства. Однако, как только Style используется в вашем приложении, он становится запечатанным объектом. Style A
становится неизменным.
Одно из возможных решений:
Style A
нужно изменить.- Создайте новый объект Style, который будет новым
Style A
ресурсом. - Создайте новую версию
Style A1
иStyle A2
. Вы должны были бы написать процедуру копирования , которая делает копии всеSetters
,Resources
и т.д. УстановитеBasedOn
для новой версииStyle A
. - Обновите коллекцию ресурсов, чтобы в ней присутствовали три новых стиля.
{DynamicResource StyleA1}
и {DynamicResource StyleA2}
теперь должен уловить тот факт, что эти ресурсы меняются (с шага 4), и автоматически обновить все ссылки.
Обратите внимание, что это очень простой сценарий. Иерархии стилей реального мира могут быть более сложными, особенно если они распределены по нескольким файлам и взяты из объединенных словарей.
Надеюсь, я понял вашу проблему и помог.
Я обнаружил, что, поскольку вы не можете использовать BasedOn
в a DynamicResource
, вы можете «преобразовать» его DynamicResource
в StaticResource
, объединив ResourceDictionary
удерживающие ваши «родительские» ресурсы с вашим текущим Window / UserControl / чем-то еще. Таким образом, теперь вы можете ссылаться на объект ресурса (например Style
), используя StaticResource
. Таким образом , вы можете использовать Datatriggers
на DynamicResource
(через преобразование).
Пример:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyProject.Styles;component/ButtonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
[*Your other resources can be put here*]
</ResourceDictionary>
</Window.Resources>
...
<Button Command="{Binding MyCommandInViewModel, RelativeSource={RelativeSource AncestorType=Window}}">
<Button.Style>
<Style BasedOn="{StaticResource StyleFromButtonStyles}" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding SomeBool}" Value="True">
<Setter Property="Button.Content" Value="{StaticResource SomeImage}"/>
</DataTrigger>
<DataTrigger Binding="{Binding SomeBool}" Value="False">
<Setter Property="Button.Content" Value="{StaticResource SomeOtherImage}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Следовательно Datatriggers
, применяются к кнопке, стилизованной в импортированном ResourceDictionary
.
Надеюсь это поможет!