【问题标题】:Dynamic resource access fails in storyboard故事板中的动态资源访问失败
【发布时间】:2010-11-26 19:56:08
【问题描述】:

亲爱的,我在 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. 我尝试从后面的代码创建故事板(仅用于测试),但无法将行 &lt;LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/&gt; 转换为程序代码,因为 LinearColorKeyFrame 不是 FrameworkElement。也许这是问题的根源?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

    【讨论】:

    • 我没有从代码中找到方法,因为LinearColorKeyFrame不是FremeworkElement,只是DependencyObject,因此我不能使用SetResourcereference来分配动态对LinearColorKeyFrame 的资源引用。所以我无法将代码&lt;LinearColorKeyFrame KeyTime="0:0:1" Value="{DynamicResource MyColor}"/&gt; 翻译成程序代码。有没有办法做到这一点?
    • 你试过用 ColorAnimation 代替 LinearColorKeyFrame 吗?见msdn.microsoft.com/en-us/library/…c-sharpcorner.com/UploadFile/rahul4_saxena/…
    • @dain:非常感谢,用ColorAnimation 替换ColorAnimationUsingKeyFrames 解决了这个问题!看起来框架不是视觉树的一部分,而动画本身是。
    • 好东西,很高兴它有帮助,感谢有关视觉树的信息,我不知道!那么这意味着如果您使用非基于帧的动画,即使是原始绑定也可以在 WPF 中工作?
    猜你喜欢
    • 2013-04-03
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多