【问题标题】:How can I write a BringToFront method for a WPF UserControl?如何为 WPF UserControl 编写 BringToFront 方法?
【发布时间】:2010-07-29 00:02:30
【问题描述】:

我正在开发一个 UserControl,称之为 CoolControl,它的作用有点像一个窗口,具有一些特殊功能。到目前为止,它可以在屏幕上调整大小和拖动。如果我使用 XAML 将多个 CoolControl 对象添加到我的应用程序窗口,最后一个声明的对象总是在前面。这很好,但我想这样做,如果我在运行时单击我的一个 CoolControl 对象,该控件将把自己放在所有其他控件的前面。

我尝试过使用Canvas.SetZIndex,但除非我无法想出一个足够聪明的解决方案,否则我看不出它对我有什么帮助。因为一旦我将一个控件的 Z-Index 设置为 9999,随着时间的推移,我单击的每个其他控件都将具有相同的值 9999。然后,最后声明的控件再次出现在前面。

如果您的任务是为某人的 UserControl 编写 BringToFront() 方法,您将如何以最简单的方式完成它?我更喜欢一个更好的解决方案,而不是获取父窗口,循环遍历所有控件,找到最大 Z-Index,然后相应地设置 CoolControl 的 Z-Index,如果这甚至是一个有效的解决方案。

【问题讨论】:

  • 您研究过叠加层吗?也许使用装饰器?
  • 请在标签中保留像“C#”这样的标签,并且不要放在标题中。谢谢。

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


【解决方案1】:

我不熟悉Canvas.SetZIndex 方法。它看起来像是某种附加属性或行为。

如果您可以提供设置 z-index 的逻辑,我已经概述了一种跟踪实例和管理 z-index 的方法,使它们保持它们被选择/创建的顺序。

public class CoolControl : UserControl
{

    public CoolControl()
    {
        InitializeComponent();
        Instances.Add(this);
    }

    static IList<CoolControl> Instances = new List<CoolControl>();

    void SelectThisInstance()
    {
        foreach(var instance in Instances)
        {
            // decrement z-index instance
        }

        // set z-index of this instance to show at top
    }
}

【讨论】:

  • 谢谢杰,我没想到。我尝试了它并且它有效,但这并不是我真正希望的解决方案,因为如果我有尚未添加到此列表中的控件(由其他人制作,或者只是一个人在他的窗口中包含的标准控件)我仍然希望我的控制跳到顶部。我希望它就像一个适用于所有控件的 BringToFront() 函数。有没有其他解决方案可以避免使用静态列表?
  • @Dalal 在不引用所有控件或让所有控件订阅事件的情况下,我想不出一种方法来做到这一点——至少不是以保持深度的方式基于选择历史的 z 堆栈。您可以通过在顶部放置一个透明的ContentControl 并将选定的控件移动到其中来“伪造”它,但这会变得混乱(我正在考虑将其发送回原始控件)而且我确信它会混乱升级您现有的拖放/调整大小/等。功能。
  • 啊,好吧。我认为这个解决方案效果很好。非常感谢。
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多