0

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

例如这个;示例 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>

任何帮助,将不胜感激。

4

2 回答 2

0

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

<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在动画中使用该属性时,代码无权访问。

于 2013-06-28T13:23:29.730 回答
0

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

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

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

于 2013-06-28T13:20:16.397 回答