如何在文件后面没有代码的情况下移动无边框 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无边框窗体怎么移动?C#

在处理 Java 中移动无边框窗口

WPF中鼠标事件MouseLeftButtonDown,MouseLeftButtonUp实现无边框窗体的最大化,还原

QQ的一些图标是隐藏了按钮的边框 但是鼠标放在上面又出现了 想问一下如何用WPF实现的

毫秒访问;如何在没有密码的情况下将其移动到不可访问状态/无 DSN 表

C#移动无边框的窗体怎么写。