Как мне переместить окно WPF с помощью MVVM? - PullRequest
4 голосов
/ 06 августа 2010

Вероятно, это избыточно для шаблона MVVM, но для меня это ново, и мне интересно посмотреть, возможно ли это.

Если я присоединяюсь к событию MouseMove для окна и выполняю DragMove, я могу переместить окно без полей. Могу ли я добиться этого каким-либо другим методом в MVVM или я должен просто принять добавление этого кода в коде окна?

Ответы [ 5 ]

3 голосов
/ 06 августа 2010

Лично я думаю, что любое решение, использующее MVVM, не улучшило бы этот код. Кроме того, это обычно то, что связано с просмотром и не имеет никакого отношения к отображаемым данным.

3 голосов
/ 06 августа 2010

Это чистая логика пользовательского интерфейса и не принадлежит ViewModel.Единственная причина, по которой вы не захотите помещать это в свой код, - это повторное использование, и это лучше решается с помощью пользовательского элемента управления, производного от Window.

2 голосов
/ 01 января 2016

Я знаю, что немного опоздал на вопрос, но это то, что я использовал уже некоторое время, и это работает как шарм.

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

Надеюсь, это поможет!

2 голосов
/ 10 июля 2013

Я собираюсь ответить на ваш вопрос. Ответ - да. Я использую Cinch , чтобы помочь мне в привязке событий и создании модели представления. В решении используется DragMove, но не как часть кода (это то, что, как я полагаю, вы спрашиваете).

Привязка событий в XAML:

<Window 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:cinchV2="clr-namespace:Cinch;assembly=Cinch.WPF"
    ...>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonDown">
            <cinchV2:EventToCommandTrigger Command="{Binding MouseLeftButtonDown}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
        ...
    </Grid>
</Window>

В ViewModel:

[ExportViewModel("MainViewModel")]
[PartCreationPolicy(CreationPolicy.NonShared)]
internal sealed class MainViewModel : ViewModelBase
{
    public SimpleCommand<object, EventToCommandArgs> MouseLeftButtonDown { get; private set; }

    [ImportingConstructor]
    public MainViewModel(IUIVisualizerService uiVisualizerService)
    {
        ...
        MouseLeftButtonDown = new SimpleCommand<object, EventToCommandArgs>(OnMouseLeftButtonDown);
    }

    private static void OnMouseLeftButtonDown(EventToCommandArgs e)
    {
        ((Window)e.Sender).DragMove();
    }
}

Довольно просто, верно? Любые события, поступающие из пользовательского интерфейса, содержат представление в качестве отправителя. Итак, здесь мы просто вызываем метод представления в обработчике событий в ViewModel.

В проекте, над которым я работаю, не используется выделенный код (даже если это не рекомендуется в MVVM).

2 голосов
/ 06 августа 2010

ИМХО, если это не то, что влияет на ваши данные (иначе Модель), то это код View и должен быть в коде сзади View, а не в Model.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...