2013-10-02 57 views
4

我正在创建一个带有无边框窗口的WPF应用程序。应用MVVVM模式(在Caliburn.Micro的帮助下)我没有文件后面的代码,但只有一个XAML文件。如何在无代码文件的情况下移动无边框wpf窗口

在一些帖子中,我发现了以下解决方案:

XAML:

<Window 
    ... 
    WindowStyle="None" MouseLeftButtonDown="WindowMouseLeftButtonDown"/> 

后面的代码:

private void WindowMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     DragMove(); 
    } 

现在我在寻找一个解决方案完全在XAML来定义这个。

任何想法?

+1

您可以使用此方法创建Window的子类,并在需要可移动无边界窗口时重新使用它来代替“Window”。 – Joey

回答

1

我认为你最好的选择是一种行为。

http://wpftutorial.net/Behaviors.html

+0

感谢您的链接。在我看来,这只适用于窗户内部的控件,而不适用于窗户本身。但很高兴知道其他情况:-) – rhe1980

+0

@ rhe1980即使该文章中的示例与您的需求不符,行为仍然可以解决您的问题。 – Foole

1

您也可以下载Microsoft.Windows.Shell DLL(Link你可以找到与谷歌的其他下载选项),它给你,让土特产品,以拖CaptionHeight的属性从顶部的窗口(如普通窗口)。

6

我将展示该解决方案是不是真的建议,但你可以把后面的代码就在你的XAML文件是这样的:

<Window 
... 
WindowStyle="None" MouseLeftButtonDown="WindowMouseLeftButtonDown"/> 
<x:Code> 
    <![CDATA[    
     private void WindowMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      DragMove(); 
     } 
    ]]> 
</x:Code> 

入住这Codeproject文章更多这方面的信息!

0

我知道我对这个问题有点迟,但这是我一直在使用的一段时间,它的作用就像一个魅力。

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; 
    } 

,并在您的视图模型

#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()); 
    } 

希望这有助于!

+0

这有代码背后的观点,我正在寻找的东西,将通过VM给我的视图的控制。 – exSnake

+0

你想通过完全在mvvm中完成这个部分来达到什么目的? –

相关问题