【问题标题】:Silverlight, WPF. How to determine is one control located over other?银光,WPF。如何确定一个控件是否位于另一个控件之上?
【发布时间】:2011-05-05 00:34:25
【问题描述】:

检查的最佳解决方案是一个控件位于另一个控件之上。

例如,我有两个 TextBox,当一个 TextBox 在另一个之上时,我需要隐藏其中一个。

并且我需要确定这些控制是否重叠,然后才能将它们添加到可视树中!

【问题讨论】:

    标签: .net wpf silverlight controls


    【解决方案1】:

    如果您追求的是工具而不是编程解决方案,snoop 会为 WPF 应用程序执行此操作。它在运行时向您显示应用中控件组合的分层视图。

    从未使用过,但Silverlight Spy 似乎是 Silverlight 的等价物。

    【讨论】:

    • 啊,我看到你编辑了这个问题。很明显,您确实希望以编程方式获得它。哦,好吧。
    【解决方案2】:

    我假设你的意思是你想知道它们是否在 Z 维度上重叠?

    未经测试:

    // requires System.Windows.Controls.Toolkit.dll
    
    using System.Windows.Controls.Primitives;
    // ...
    
    Rect? rect1 = myControl1.GetBoundsRelativeTo(someParentContainer);
    Rect? rect2 = myControl2.GetBoundsRelativeTo(someParentContainer);
    
    bool areIntersecting = rect1 != null && rect2 != null
        && rect1.Value.Intersect(rect2.Value) != Rect.Empty;
    

    【讨论】:

    • 谢谢您的回复。是的,这就是我要找的。但我不能使用任何工具包,只是这样的要求。在明确的 WPF 中我能找到类似的东西吗?
    • @Evgeny,该工具包是开源的,您可以在此处找到GetBoundsRelativeTo(...) 的实现:silverlight.codeplex.com/SourceControl/changeset/view/…
    • 我有异常:指定的Visual和这个Visual不共享一个共同的祖先,所以两个Visual之间没有有效的转换。
    • 在将它们添加到可视化树之前,我需要检查它们是否重叠
    • @Evgeny,是的,这种方法只有在控件被添加到可视化树并且布局是最终的后才能工作。通常到那时删除您的其他文本框不是问题,它对用户来说已经足够快了。 ;-) ...如果你真的,真的必须检查之前,那就更努力了。您必须事先在内存中构建布局。您必须为每个控件显式设置宽度、高度和位置。然后,您可以使用这些值来构建您自己的 Rect 实例并使用上述方法检查是否有任何相交。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多