WPF: обработка модальных диалогов - PullRequest
2 голосов
/ 27 февраля 2011

Я нашел хорошее решение на этом веб-сайте http://www.thesilvermethod.com/Default.aspx?Id=ModalDialogManagerAsimpleapproachtodealingwithmodaldialogsinMVVM

Но пришлось внести некоторые изменения, чтобы интегрировать его в мой код.По пути я получаю некоторые небольшие проблемы, в основном потому, что есть определенные части кода, которые я не получаю полностью.

Как я это сделал, это связал ModalDialogManager со свойством MainWindow типа IDialogViewModel.Затем у меня есть класс WindowsManager, который обрабатывает помещение нужного экземпляра в это свойство.Одним из них является EditDialogViewModel, который предоставляет EditableViewModel этому DialogManager.Я установил представление EditDialog в качестве DataTemplate для этой EditDialogViewModel, но когда я показываю его, новое окно показывает только его часть.

Вот представление:

<UserControl.Resources>

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <ResourceDictionary Source="EditDataTemplates.xaml" />

        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="7*" />
            <RowDefinition Height="2*" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>

        <ContentControl Content="{Binding Path=ViewModel}" />

        <TextBlock Text="{Binding Path=ViewModel.Error}" />

        <UniformGrid Grid.Row="2" Columns="2">

            <Button Command="{Binding SaveCommand}" />

            <Button Command="{Binding CancelCommand}" />

        </UniformGrid>

    </Grid>
</UserControl>

Но новый диалогокно показывает только ContentControl, привязанный к свойству ViewModel EditDialogViewModel (оно содержит редактируемую ViewModel).

Я думаю, что это как-то связано с этим кодом в ModelDialogManager:

 void Show()
    {
        if (_window != null) Close();

        Window w = new Window();
        _window = w;
        w.Closing += w_Closing;
        w.Owner = GetParentWindow(this);

        w.DataContext = this.DataContext;
        w.SetBinding(Window.ContentProperty, ""); //This code here does something I don't fully understand

        w.Title = Title;
        w.Icon = Icon;
        w.Height = DialogHeight;
        w.Width = DialogWidth;
        w.ResizeMode = DialogResizeMode;
        w.ShowDialog();
    }

Он применяет привязку там, но я думаю, что это только первый ContentControl, который связывается или что-то в этом роде.Это довольно сложно.

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

Есть ли способ исправить это или лучший способ обработки диалоговых окон Modal в WPF?

EDIT

Хорошо, я собираюсь это признать.Я огромный идиот.Это было так просто, я просто не мог этого увидеть.Я установил Высота и Ширина в UserControl на фиксированное значение, в то время как я все еще возился с тем, что это окно.Так что на самом деле это показывало все, просто не было места.Я понятия не имею, почему мышь не работала в этот момент, но теперь она работает отлично.

1 Ответ

2 голосов
/ 10 марта 2011

Ответ «лучший способ обработки диалоговых окон Modal в WPF?» в расширенном наборе инструментов WPF есть новый элемент управления, называемый Child Window , который решает проблемы модального диалога.

enter image description here

...