我有一个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();
}
但是当我点击并拖动时,我看到事件被触发但我的整个应用程序不会像它应该的那样移动。这是为什么?
答案 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);
}