【问题标题】:How is Storyboard.TargetName implemented?Storyboard.TargetName 是如何实现的?
【发布时间】:2012-01-13 00:09:41
【问题描述】:

我正在创建一个需要获取对另一个控件的引用的自定义工具提示。它与 Storyboard.TargetName 的工作方式非常相似。现在,我已经推出了自己的实现,了解如何获取目标引用,例如(请注意,我的目标将始终是 ToolTip 的父级):

public object FindTarget(string targetName)
{
    var target = default(object);
    FrameworkElement item = this;
    while ((item = item.Parent as FrameworkElement) != null && target == null)
        target = item.FindName(targetName);
    return target;
}

我的问题是有没有一种内置于框架中的方法来做到这一点?这似乎是一项足够常见的任务。

编辑

事实证明,上述算法实际上不适用于工具提示,因为它们的 Parent 属性始终为空。我假设 ToolTips 是基于 Popups 的,这就是 Parent 为 null 的原因。

【问题讨论】:

    标签: silverlight custom-controls


    【解决方案1】:

    您可以使用扩展方法使其在您想要的任何地方都可见:

    public static object GetElementByName(this FrameworkElement baseElement, string name) 
        {
            object target = null;
    
            FrameworkElement item = baseElement;
            while ((item = item.Parent as FrameworkElement) != null && target == null)
                target = item.FindName(name);
    
            return target;
        }
    

    在此之后,您可以在任何 FrameworkElement 上调用此方法。 尽管您应该知道 FindName 不适用于模板中定义的名称这一事实。

    【讨论】:

    • 对,但这不是关于扩展方法的问题。我只是希望有一种成熟的方法可以做到这一点。不是因为我想在任何地方都使用它,而是我不想重复一些可能已经实现/正确处理我还没有考虑过的边缘情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2011-04-26
    • 2015-05-22
    • 2015-04-22
    • 2020-07-31
    • 2011-04-24
    • 2016-04-17
    相关资源
    最近更新 更多