新窗口上的MouseDown事件不是DragMove MainWindow

时间:2013-12-22 10:54:25

标签: c# wpf

我有一个WPF应用程序,我通过执行以下操作删除了边框和默认控件:

WindowStyle="None" AllowsTransparency="True"

现在我添加了一个MouseDown处理程序 MouseDown =" Window_MouseDown" 并添加了以下代码以允许我移动我的窗口:

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        try
        {
            if (e.ChangedButton == MouseButton.Left)
                DragMove();
        }
        catch (Exception ex) { }
    } 

但是现在我有一个UserControl,我想调整大小到我的应用程序的完整大小,所以为了实现这一点,我创建了一个与我的MainWindow大小相同的新窗口,并将UserControl放在它上面。我创建了这个新窗口并将其父级设置为我的主应用程序,如下所示:

    public MyFullScreenWindow()
    {
        InitializeComponent();

        this.Owner = App.Current.MainWindow;

    }

我像这样启动这个窗口:

            MyFullScreenWindow fullScreen = new MyFullScreenWindow();
            fullScreenVideo.ShowDialog();

我的问题是,当用户点击并移动这个新窗口时,我仍希望移动整个应用程序。为此,我向MyFullScreenWindow添加了一个事件:

public partial class MyFullScreenWindow: Window
{
    static public event EventHandler MouseDownEvent;


    public MyFullScreenWindow()
    {
        InitializeComponent();

        this.Owner = App.Current.MainWindow;
    }



    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (MouseDownEvent != null)
        {
            MouseDownEvent(sender, e);
        }
    }
 }

我在MainWindow中处理此事件的方式如下:

 MyFullScreenWindow.MouseDownEvent += new EventHandler(MyFullScreenMouseDownHandler);

    private void MyFullScreenMouseDownHandler(object sender, EventArgs e)
    {

        DragMove();

    }

但是当我点击并拖动时,我看到事件被触发但我的整个应用程序不会像它应该的那样移动。这是为什么?

2 个答案:

答案 0 :(得分:1)

只需添加以下功能代码

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        // Begin dragging the window
        this.DragMove();
    }

将窗口移动到您想要的位置。

答案 1 :(得分:0)

我不知道您的问题的背景,但为什么要创建一个新窗口,将其“放置”在父窗口中?您可以在不创建新窗口的情况下使用控件。

您可能正在执行此操作,因为您需要AllowTransparency = false功能,同时在AllowTransparency = true窗口中显示它。 (我在使用DirectShow时遇到过这种情况)。如果您是为自定义窗口镶边执行此操作,则不要使用AllowTransparency - 它会大大降低性能。毕竟,它正在创建每一帧的画面并禁用GPU加速!相反,您可以适应CustomChromeWindow项目(在互联网上找到)。

请注意,您可以启用主窗口,以便它可以处理来自基础窗口的消息:

 public class WindowSecond : Window
    {
        public WindowSecond()
        {
            Owner = Application.Current.MainWindow;
            MouseDown += delegate
                {
                    // maybe cache it.
                    IntPtr handle = new WindowInteropHelper(Owner).Handle;

                    EnableWindow(handle, true);
                    Application.Current.MainWindow.DragMove();
                    EnableWindow(handle, false);
                };
        }

        [DllImport("user32")]
        internal static extern bool EnableWindow(IntPtr hwnd, bool bEnable);
    }