【问题标题】:Common class of TextBlock, Grid in WPF C#WPF C#中TextBlock、Grid的通用类
【发布时间】:2014-04-25 17:29:00
【问题描述】:

我正在为所有 WPF 控件(如 TextBlock、Grid、TextBox...)创建一个通用动画函数,如下所示

private void animateFadeOut(*** displayObj)
{
    displayObj.Opacity = 1;
    System.Windows.Media.Animation.DoubleAnimation fadingAnimation = new System.Windows.Media.Animation.DoubleAnimation();
    fadingAnimation.From = 1;
    fadingAnimation.To = 0;
    fadingAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));
    displayObj.BeginAnimation(TextBlock.OpacityProperty, fadingAnimation);
}

所以我只想知道我应该写哪个类来代替***。我尝试了 UserControl,Object 但在将 TextBlock 或 Grid 转换为 UserControl 时遇到了 UserControl 的问题。在 Object 中,没有 Opacity 值。那么处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: c# wpf user-controls wpf-controls


    【解决方案1】:

    GridTextBlockTextBox 的最高共同祖先是 FrameworkElement,但如果你想为 Opacity 设置动画,那么它是更高级别 UIElement 的属性

    private void animateFadeOut(UIElement displayObj)
    {
        displayObj.Opacity = 1;
        System.Windows.Media.Animation.DoubleAnimation fadingAnimation = new System.Windows.Media.Animation.DoubleAnimation();
        fadingAnimation.From = 1;
        fadingAnimation.To = 0;
        fadingAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));
        displayObj.BeginAnimation(UIElement.OpacityProperty, fadingAnimation);
    }
    

    【讨论】:

    • 我认为Opacity 继承自UIElement 中的FrameworkElement?我也可以使用displayObj.BeginAnimation(FrameworkElement.OpacityProperty, fadingAnimation); 吗?
    • @Bolu 您可以为FrameworkElement 执行此操作,因为它继承自UIElement,并且在每个后代类中,如GridTextBoxTextBlock 等。唯一的问题是您希望在您的方法中接受多广泛的元素。 Opacity 的最宽范围是 UIElement,然后您可以将其缩小到更具体的元素。
    • 但是FrameworkElement 提供的远比UIElement 多(尽管可能不会在这种特殊情况下使用),并且应该在这种情况下用作一次性的选择。
    • @Bolu,同样的问题是你想要传递的元素范围有多大,你想在里面做什么。在这种情况下,它只是 Opacity 动画,所以 UIElement 就足够了。如果您需要来自FrameworkElement 的属性,那么显然您需要FrameworkElement。您需要选择符合您要求的课程,在这种情况下,我不需要 FrameworkElementOpacity 设置动画,因为它是 UIElement 的一部分
    • 我关心的是你的第一个陈述,它仍然有效吗? Highest common ancestor for Grid, TextBlock and TextBox is FrameworkElement but if you want to animate Opacity then it's property of even higher class UIElement。对我来说,没有必要比FrameworkElement 更高。
    【解决方案2】:

    虽然不确定您的代码是否也适用于 Grid,但您要查找的类是 "UIElement"

    【讨论】:

      【解决方案3】:

      您可以在MSDN 上查看他们的继承层次结构。 例如。对于Grid

      Inheritance Hierarchy
      System.Object 
        System.Windows.Threading.DispatcherObject
          System.Windows.DependencyObject
            System.Windows.Media.Visual
              System.Windows.UIElement
                System.Windows.FrameworkElement
                  System.Windows.Controls.Panel
                    System.Windows.Controls.Grid
                      System.Windows.Controls.Primitives.SelectiveScrollingGrid
      

      它们都在System.Windows.Controls 命名空间下,但我发现使用FrameworkElement 更好(在我的情况下,我需要调用BringIntoView())。您可以检查层次结构并自行决定。但是应该使用 AFAIK,FrameworkElement,因为它提供了您在您的情况下可能需要访问的所有内容(属性和方法)。

      【讨论】:

      • 我也试过 System.Windows.Controls。但只有 FrameworkElement 对我来说工作正常。谢谢博卢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多