代码之家  ›  专栏  ›  技术社区  ›  Vlad

脚本中的动态资源访问失败

  •  1
  • Vlad  · 技术社区  · 14 年前

    亲爱的各位,我对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/wpf4中的行为是相同的。
    4. 我试着从后面的代码创建故事板(只是为了测试),但无法转换行 <LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/> 进入程序代码,因为 LinearColorKeyFrame 不是 FrameworkElement . 也许这就是问题的根源?
    1 回复  |  直到 14 年前
        1
  •  1
  •   dain    14 年前

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