WPF窗口的吸附/粘性效果

27
我正在寻找一种解决方案,将窗口的粘附/吸附功能(类似Winamp)添加到现有的WPF应用程序中。与此前在这里提出的问题相同,只是我需要它适用于WPF。

它不必具备停靠功能,只要能够吸附到同一应用程序内其他窗口的边框和屏幕边缘(包括任务栏)即可。最好是开放源代码的解决方案。

谢谢


这个很好用。我们如何修改这个示例以禁用窗口的Aero Snap功能? - Alexandru Dicu
解决方案链接已失效...你能重新上传一下吗? - Erik BRB
1
@ErikBRB 是的,那个托管现在已经失效了。请参考下面被采纳的答案,找到我后来发现更好的解决方案。http://stackoverflow.com/a/1587439/84852 - Andrija
@Andrija 哪个答案被接受了?我没有看到任何一个答案被标记为已接受。 - Mass Dot Net
2个回答

2

这里是您实际请求的解决方案:

假设我们有两个名为MainWindow和Window2的Xaml窗口:

MainWindow:

 Window2 windows2;

        public void RealodPos()
        {
            if (windows2 == null) { windows2 = new Window2(this); this.Top = 300; }

            windows2.Top = this.Top;
            windows2.Left = this.Width + this.Left - 15;
            windows2.Show();

        }

        private void Window_Activated(object sender, EventArgs e)
        {
            RealodPos();
        }

        private void SizeChenged(object sender, SizeChangedEventArgs e)
        {
            RealodPos();
        }

        private void LocationChange(object sender, EventArgs e)
        {
            RealodPos();
        }

窗口2:

   public partial class Window2 : Window
    {

        MainWindow Firstwin;
        public Window2(MainWindow FirstWindow)
        {
            InitializeComponent();
            Firstwin = FirstWindow;
        }
        void RealodPos() 
        {
            this.Top = Firstwin.Top;
            this.Left = Firstwin.Width + Firstwin.Left - 15;
        }

        private void Window_Activated(object sender, EventArgs e)
        {
            RealodPos();
        }

        private void Window_LocationChanged(object sender, EventArgs e)
        {
            RealodPos();
        }

        private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            RealodPos();
        }
    }

结果:

作为软件工程师的建议:

提示1:我不知道你会在哪里使用它,但最好将其转换为可重用组件,而不是硬编码为仅具有2个窗口。

提示2:转换

public Window2(MainWindow FirstWindow)

MainWindow 参数作为 Window 类的格式,以便在其他应用程序中重复使用更灵活的指针。

这是我建议给 pro-WPF 开发人员的解决方案:

不要按照这种方式操作,而是在 XAML 中制作自己的自定义窗口,并使用 UserControls 代替其他所需的窗口。

感谢阅读,请告诉我如果您需要其他任何东西或者需要代码作为项目文件。


0

WPF Docking Library 可能提供了你所需要的一些功能,但我不确定它是在整个屏幕上工作还是只在你的应用程序窗口中工作。


2
我已经尝试了项目演示。在应用程序内部的窗口之间,捕捉窗口功能无法正常工作。只能将窗口停靠在主窗口上。 - Andrija

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接