【问题标题】:SolidColorBrushes as Dynamic Resources are not updatingSolidColorBrushes 作为动态资源没有更新
【发布时间】:2013-06-28 11:25:10
【问题描述】:

我有一个窗口,上面有颜色/画笔的数字或动态资源。

例如这个;示例 1 不更新“DynamicResource ColFancyMed”

<Rectangle x:Name="dbBarPeekOutRect1" Margin="3,10,10,10" >
    <Rectangle.Fill>
        <SolidColorBrush Color="{DynamicResource ColFancyMed}" />
    </Rectangle.Fill>
</Rectangle>

当我的应用启动时,会读取资源文件并显示正确的颜色。

然而,这些颜色是主题化的,所以我有许多资源字典,其中包含这些资源键。因此我像这样更改资源字典

Application.Current.Resources.MergedDictionaries.RemoveAt(0)
Application.Current.Resources.MergedDictionaries.Insert(0, dict)

这适用于其他地方,但不适用于上述情况。有趣的是,如果我使用以下内容。我能看到的唯一区别是一个是颜色,另一个是 SolidColorBrush。

示例 2 更新“DynamicResource ColFancyMed”

<Rectangle x:Name="dbBarPeekOutRect1" Margin="3,10,10,10" Fill="{DynamicResource ColFancyMed}"/>

然后颜色会改变。

那么为什么示例 1 不起作用而示例 2 起作用?

同样,另一个不起作用的地方是在例子中;

<Storyboard x:Key="dbBarPeekOutHighlight">
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="dbBarPeekOutRect1">
            <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource ColFancyMed}"/>
            <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FFF2F6F9"/>
        </ColorAnimationUsingKeyFrames>
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="dbBarPeekOutRect2">
            <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource ColFancyMed}"/>
            <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FFF2F6F9"/>
        </ColorAnimationUsingKeyFrames>
    </Storyboard>

任何帮助将不胜感激。

【问题讨论】:

  • 您具体需要什么?有些人不明白这个问题。
  • 如果我交换资源文件,那么一些动态资源不会更新。有些人会。为什么上面没有更新?

标签: c# .net wpf vb.net


【解决方案1】:

关于故事板的最后一个示例,如 MSDN 所述 here

您不能使用动态资源引用或数据绑定表达式来设置 Storyboard 或动画属性值。这是因为 Style 中的所有内容都必须是线程安全的,并且计时系统必须冻结 Storyboard 对象以使其成为线程安全的。如果 Storyboard 或其子时间线包含动态资源引用或数据绑定表达式,则无法冻结 Storyboard。有关冻结和其他 Freezable 功能的更多信息,请参阅 Freezable 对象概述。

关于第一个示例,我不确定问题是否在于您正在实例化 SolidColorBrush 对象而不是直接绑定到您的资源。

【讨论】:

  • 好的听起来像是对这部分问题的回答。我将它设置为 Windows.Resources 中的资源的 staticResource。然后,在 Windows.Resources 中,我指的是我的应用程序资源。我只是不知道如何让颜色资源引用颜色资源。
【解决方案2】:

对我来说,这个例子很有效:

<Grid>
    <Rectangle x:Name="dbBarPeekOutRect1" Width="100" Height="100" Margin="3,10,10,10" >
        <Rectangle.Fill>
            <SolidColorBrush Color="{DynamicResource MyColor}" />
        </Rectangle.Fill>
    </Rectangle>

    <Rectangle x:Name="dbBarPeekOutRect2" Width="100" Height="100" HorizontalAlignment="Left" Fill="{DynamicResource MyColor2}"/>

    <Button Name="ChangeResource" Content="ChangeResource" Width="100" Height="30" VerticalAlignment="Bottom" Click="ChangeResource_Click" />
</Grid>

ChangeResource Button的处理程序:

    private void ChangeResource_Click(object sender, RoutedEventArgs e)
    {
        Color MyCodeColor = Colors.BlanchedAlmond;
        SolidColorBrush MyBrush = Brushes.Aquamarine;

        // Set the new value
        Application.Current.Resources["MyColor"] = MyCodeColor;
        Application.Current.Resources["MyColor2"] = MyBrush;
    }   

我把颜色放到资源App.xaml文件里:

<Application.Resources>
    <Color x:Key="MyColor">#D8C13E</Color>
    <SolidColorBrush x:Key="MyColor2" Color="Green" />
</Application.Resources>        

至于动画...如果我没记错的话,当使用动画时,只要动画仍然处于活动状态,WPF 动画就会锁定目标属性值。因此DynamicResource 转换为StaticResource。例如:同样当你在动画中使用属性Opacity时,代码无权访问。

【讨论】:

  • 看起来不错。但是为什么你的工作。它与上下文没有任何关系吗?我的应用程序也可以正常启动,只是它是动态更改的。
  • 可能是因为SolidColorBrush Color = Color type,而对于Rectangle.Fill 属性需要SolidColorBrush type。并且您使用ColFancyMed 作为所有值。
  • 为了测试和写下我在这些周围的问题。在我的问题中,我注意到一个是颜色,一个是刷子。否则它甚至不会编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多