我想知道是否有办法使用动态资源的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变得一成不变.
您可以使用的一种解决方法是:
Style A 需要改变. Style A资源的新Style对象.Style A1和Style A2.你需要写一个复制过程,使所有的副本Setters,Resources等设置BasedOn到新版本Style A.{DynamicResource StyleA1}而{DynamicResource StyleA2}现在应该拿起一个事实,即这些资源的变化(从步骤4),并自动更新任何引用.
请注意,这是一个非常简单的场景.真实世界风格的层次结构可能更复杂,特别是如果它们分布在多个文件中并来自合并的字典.
希望我理解你的问题并帮助我.
小智 14
我发现,因为你不能使用BasedOn上DynamicResource,你可以"转换"的DynamicResource,以StaticResource通过合并ResourceDictionary牵着你的"父"资源添加到当前窗口/用户控件/不管.这样,您现在可以使用引用资源对象(例如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>
Run Code Online (Sandbox Code Playgroud)
因此Datatriggers适用于在导入中设置样式的按钮ResourceDictionary.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
15609 次 |
| 最近记录: |