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

如何在Silverlight4用户控件中动态地设置属性的动画?

  •  0
  • dain  · 技术社区  · 14 年前

    我在Silverlight4用户控件中遇到了一个令人费解的限制。

    我试图实现的是有一个面板,当按下一个按钮时,面板从最小化状态滑出,但是它的标题栏应该是可拖动的,这样最大化的状态可以调整大小。

    我为滑出所做的是动画此面板的父网格的maxheight属性,即使没有面板的硬编码高度也能很好地工作,但我不知道如何使其动态。

    试图将一个变量从后面的代码绑定到“doubleanimation”的“to”参数不起作用,它只是静默地被忽略。

    当我创建用户控件来表示视图时,具有x:name属性的元素不会自动生成。

    我尝试使用下面的代码来解决这个问题,该代码模拟自动生成的代码中发生的情况(额外的好处是,只有在实际加载布局后才能完成):

    public DoubleAnimation PanelOpenMaxHeightDoubleAnimation;
    
    private void LayoutRoot_Loaded(object sender, System.Windows.RoutedEventArgs e)
    
    {
    
        var LayoutRootreference = sender as Grid;
    
        PanelOpenMaxHeightDoubleAnimation = ((DoubleAnimation)(LayoutRootreference.FindName("PanelOpenMaxHeightDoubleAnimation")));
    
        PanelOpenMaxHeightDoubleAnimation.To = 383;
    
    }
    

    但是,当尝试将的值设置为时,这会中断,因为findname返回空值(我在XAML中为此特定动画手动将x:name设置为“panelopenmaxheightdoubleanimation”)。我有一种潜移默化的怀疑:findname不能从VisualStates中选择Doubleanimations,只有实际布局的子级?

    我确实在以下位置找到了有关XAML名称范围的文档: http://msdn.microsoft.com/en-us/library/cc189026(v=VS.95).aspx#UserControls ,但并不真正理解我在本段中的选择(非常有限的除外):

    对于UserControl,在定义xaml中没有与UserControl部分等效的模板部分属性约定,也没有应用任何模板。然而,定义和使用之间的名称作用域保持断开连接,因为定义名称作用域是定义的,然后在将用户控件打包到程序集中以供重用时有效密封的。这里的最佳实践是定义用户控件,以便需要设置以修改定义xaml的任何值也作为用户控件的公共属性公开。

    最后一句话是什么意思?

    想知道下一步我能做什么?我应该尝试从代码生成整个状态吗?

    1 回复  |  直到 14 年前
        1
  •  0
  •   dain    14 年前

    好吧,设法解决了,所以我在分享解决方案。

    我没有尝试在资源中获取对Doubleanimation的引用,而是在要动画化的布局中命名网格,并使用原始问题中的代码获取对该网格的引用:

    var SlidePanel = ((Grid)(LayoutRootreference.FindName("SlidePanel")));
    

    这确实返回了元素,并使用它可以创建一个双重含义和一个故事板从零开始纯粹在代码中。我只是用这个代码示例作为起点: http://msdn.microsoft.com/en-us/library/cc189069(VS.95).aspx#procedural_code

    最好的部分是,即使在故事板中设置了所有内容之后,也可以将doubleanimation.to参数更改为参数,所以现在我所做的只是在每次调用Storyboard.begin()之前将其重置为计算值。

    手动设置所有这些设置有点费劲,但至少一旦设置好,它就会很好地工作。