如何在文件后面没有代码的情况下移动无边框 wpf 窗口
Posted
技术标签:
【中文标题】如何在文件后面没有代码的情况下移动无边框 wpf 窗口【英文标题】:How to move borderless wpf window without code behind file 【发布时间】:2013-10-08 11:18:10 【问题描述】:我正在创建一个带有无边框窗口的 WPF 应用程序。应用MVVVM
模式(在 Caliburn.Micro 的帮助下)我没有代码隐藏文件,只有一个 XAML 文件。
在几篇文章中我找到了以下解决方案:
XAML:
<Window
...
WindowStyle="None" MouseLeftButtonDown="WindowMouseLeftButtonDown"/>
后面的代码:
private void WindowMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
DragMove();
现在我正在寻找一种在 XAML 中完全定义它的解决方案。
有什么想法吗?
【问题讨论】:
您可以创建一个使用这种方法的 Window 子类,并在需要可移动无边框窗口时重新使用它而不是Window
。
【参考方案1】:
我将提出的解决方案并不是真正的建议,但您可以将您的代码直接放在您的 XAML 文件中,如下所示:
<Window
...
WindowStyle="None" MouseLeftButtonDown="WindowMouseLeftButtonDown"/>
<x:Code>
<![CDATA[
private void WindowMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
DragMove();
]]>
</x:Code>
查看这篇Codeproject 文章了解更多信息!
【讨论】:
【参考方案2】:我认为你最好的选择是一种行为。
http://wpftutorial.net/Behaviors.html
【讨论】:
感谢您的链接。在我看来,这仅适用于窗口内的控件,但不适用于窗口本身。但很高兴知道其他情况:-) @rhe1980 即使那篇文章中的示例不符合您的需求,行为仍然可以解决您的问题。【参考方案3】:您可以下载 Microsoft.Windows.Shell dll(Link。您可以通过 google 找到另一个下载选项),它为您提供 CaptionHeight 的属性,使您可以从顶部拖动窗口(就像普通的窗口)。
【讨论】:
【参考方案4】:您可以使用EventCommandTrigger
。检查这些参考:
http://www.danharman.net/2011/08/05/binding-wpf-events-to-mvvm-viewmodel-commands/ http://zamjad.wordpress.com/2011/06/07/convert-event-into-command-in-mvvm-model/
【讨论】:
感谢您的回答。我正在寻找的只是 XAML 中的解决方案,而不使用视图模型或视图中的代码隐藏文件。【参考方案5】:我知道我问这个问题有点晚了,但这是我已经使用了一段时间了,它就像一个魅力。
DashboardViewModel viewModel;
public DashboardView()
InitializeComponent();
viewModel = new DashboardViewModel();
viewModel.RequestClose += (s, e) => Application.Current.Dispatcher.Invoke(this.Close);
viewModel.RequestMinimize += (s, e) => Application.Current.Dispatcher.Invoke(() => this.WindowState = WindowState.Minimized; );
DataContext = viewModel;
在你的 viewModel 中有类似的东西
#region Public Event Handlers
public event EventHandler<EventArgs> RequestClose;
public event EventHandler<EventArgs> RequestMinimize;
#endregion
使用 ICommand 接口...
#region ICommand Members
public ICommand CloseCommand get; private set;
public ICommand MinimizeCommand get; private set;
#endregion
配置命令...
private void SetupCommands()
CloseCommand = new RelayCommand(CloseApplication);
MinimizeCommand = new RelayCommand(MinimizeApplication);
这是 RelayCommand 类。
public class RelayCommand : ICommand
#region Private Readonly Properties
private readonly Action<object> executeCommand;
private readonly Predicate<object> canExecute;
#endregion
#region Constructors
public RelayCommand(Action<object> execute) : this(execute, null)
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
if (execute == null)
throw new ArgumentNullException("execute");
this.executeCommand = execute;
this.canExecute = canExecute;
#endregion
#region Public ICommand Members
public bool CanExecute(object parameter)
return canExecute == null ? true : canExecute(parameter);
public event EventHandler CanExecuteChanged
add CommandManager.RequerySuggested += value;
remove CommandManager.RequerySuggested -= value;
public void Execute(object parameter)
executeCommand(parameter);
#endregion
还有一些示例方法...
private void MinimizeApplication(object obj)
RequestMinimize(this, new EventArgs());
private void CloseApplication(object obj)
RequestClose(this, new EventArgs());
希望这会有所帮助!
【讨论】:
视图中有代码,我正在寻找可以通过 vm 控制视图的东西。 你想通过将这部分完全放在 mvvm 中来实现什么?以上是关于如何在文件后面没有代码的情况下移动无边框 wpf 窗口的主要内容,如果未能解决你的问题,请参考以下文章
WPF中鼠标事件MouseLeftButtonDown,MouseLeftButtonUp实现无边框窗体的最大化,还原
QQ的一些图标是隐藏了按钮的边框 但是鼠标放在上面又出现了 想问一下如何用WPF实现的