故事板中的动态资源访问失败

时间:2010-11-26 10:59:03

标签: c# wpf

亲爱的,我在WPF 3.5中遇到了以下问题。在故事板中访问动态资源时,如果在包含目标控件的窗口中定义资源,则该值是错误的(似乎未解析引用)。

我做错了什么,是否有正确的方法(或至少是一种解决方法)?基本上我希望故事板能够使用动态资源中的颜色,而我只能在窗口级别将这些资源放在本地。

示例代码:

<Window
    x:Class="Test.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    MouseDoubleClick="Window_MouseDoubleClick">
    <Window.Resources>
        <Color x:Key="MyColor">Blue</Color>
    </Window.Resources>
    <Grid x:Name="outer">
        <Grid.Resources>
            <Storyboard x:Key="MyBoard">
                <ColorAnimationUsingKeyFrames
                    Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                    <LinearColorKeyFrame KeyTime="0:0:0" Value="Red"/>
                    <LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
            <SolidColorBrush x:Key="MyBrush" Color="{DynamicResource MyColor}"/>
        </Grid.Resources>
        <Grid x:Name="inner" Background="Green"/>
    </Grid>
</Window>

代码隐藏:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        Storyboard s = (Storyboard)outer.FindResource("MyBoard");
        inner.BeginStoryboard(s);
        //SolidColorBrush b = (SolidColorBrush)outer.FindResource("MyBrush");
        //inner.Background = b;
    }
}

问题是引用Value="{DynamicResource MyColor}"无效,值是透明的。

我尝试了以下内容:

  1. 如果我将MyColor的定义从窗口资源移动到应用程序资源,代码将按预期工作。
  2. 如果我将故事板替换为分配另一个资源(在Window_MouseDoubleClick中注释掉前两行,并取消注释其余资源),则动态资源访问将起作用。
  3. .NET 4 / WPF 4中的行为是相同的。
  4. 我尝试从后面的代码创建故事板(仅用于测试),但无法将行<LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/>转换为过程代码,因为LinearColorKeyFrame不是FrameworkElement。也许这是问题的根源?

1 个答案:

答案 0 :(得分:1)

我不知道是否有办法使用XAML和绑定,我无法在Silverlight中使用类似的东西,但作为一种解决方法,您可以在代码中创建StoryBoard和动画: http://msdn.microsoft.com/en-us/library/cc189069(VS.95).aspx#procedural_code