Использование свойства стиля BasedOn в DynamicResources

Интересно, есть ли способ использовать свойство basedOn стилей wpf с динамическими ресурсами. например

<Style BasedOn="{DynamicResource somestyle}">
   <Setter Property="SomeProp" Value="SomeValue"/>
</Style>

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

Ответов (2)

Решение

Думаю, основная причина - опломбированные объекты. Если у вас есть иерархия стилей:

       Style A
      /       \
  Style A1  Style A2

это может быть не сложный сценарий. Вы имеете в виду , StyleA используя динамический ресурс, поэтому всякий раз , когда этот ресурс меняется, Style A1 и Style A2 следует изменить их BasedOn свойства. Однако, как только Style используется в вашем приложении, он становится запечатанным объектом. Style A становится неизменным.

Одно из возможных решений:

  1. Style A нужно изменить.
  2. Создайте новый объект Style, который будет новым Style Aресурсом.
  3. Создайте новую версию Style A1и Style A2. Вы должны были бы написать процедуру копирования , которая делает копии все Setters, Resourcesи т.д. Установите BasedOnдля новой версии Style A.
  4. Обновите коллекцию ресурсов, чтобы в ней присутствовали три новых стиля.

{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 .

Надеюсь это поможет!