在DynamicResources上使用BasedOn Style属性

Joa*_*mer 25 wpf xaml

我想知道是否有办法使用动态资源的wpf样式的basedOn属性.例如

<Style BasedOn="{DynamicResource somestyle}">
   <Setter Property="SomeProp" Value="SomeValue"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

这例如抛出一个错误,表明不能使用dynamicnources和BasedOn样式.我想知道有人能做到这一点吗?谢谢

Szy*_*zga 17

我认为主要原因是密封物体.如果您有Style层次结构:

       Style A
      /       \
  Style A1  Style A2
Run Code Online (Sandbox Code Playgroud)

这可能不是一个困难的场景.你是指StyleA利用动态资源,所以每当该资源的变化,Style A1并且Style A2应该改变他们的BasedOn财产.但是,一旦在您的应用程序中使用Style,它就会成为一个密封对象.Style A变得一成不变.

您可以使用的一种解决方法是:

  1. Style A 需要改变.
  2. 创建一个将成为新Style A资源的新Style对象.
  3. 创建一个新版本Style A1Style A2.你需要写一个复制过程,使所有的副本Setters,Resources等设置BasedOn到新版本Style A.
  4. 更新资源集合,以便存在三种新样式.

{DynamicResource StyleA1}{DynamicResource StyleA2}现在应该拿起一个事实,即这些资源的变化(从步骤4),并自动更新任何引用.

请注意,这是一个非常简单的场景.真实世界风格的层次结构可能更复杂,特别是如果它们分布在多个文件中并来自合并的字典.

希望我理解你的问题并帮助我.

  • 这个场景怎么样 - 一个不同的(Ux)团队创建基本样式......开发人员除了基本样式之外还想设置几个属性.理想情况下,这是DevStyle BasedOn"DynamicResource UxStyle"可能有帮助的场景.如果这不可能,在将2个样式应用于控件之前合并2个样式的替代方案是什么? (4认同)

小智 14

我发现,因为你不能使用BasedOnDynamicResource,你可以"转换"的DynamicResource,以StaticResource通过合并ResourceDictionary牵着你的"父"资源添加到当前窗口/用户控件/不管.这样,您现在可以使用引用资源对象(例如Style)StaticResource.这样,您就可以使用DatatriggersDynamicResource(通过转换).

例:

<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>
Run Code Online (Sandbox Code Playgroud)

因此Datatriggers适用于在导入中设置样式的按钮ResourceDictionary.

希望这可以帮助!