Вот как я запускаю свои команды. У этого кода есть все, что вам нужно в значительной степени
from subprocess import Popen, PIPE
cmd = "ls -l ~/"
p = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
print "Return code: ", p.returncode
print out.rstrip(), err.rstrip()
Ответ таков: вам не следует закрывать свои пользовательские элементы управления (если они не используются в качестве отдельных диалогов, и это не ваш случай, согласно вашему комментарию выше).
Все изменения в видимости пользовательских элементов управления касаются навигации. Как только вы логически перейдете к функции, включающей другой пользовательский контроль, вам придется скрыть старый и показать новый элемент управления. Обычно это делается с помощью выбора шаблона:
Два шаблона, один на UserControl, каждый из которых связан с соответствующей ViewModel:
<DataTemplate DataType="{x:Type ViewModels:FirstViewModel}">
<controls:FirstControl />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:SecondViewModel}">
<controls:SecondControl />
</DataTemplate>
Затем позже мы объявляем заполнитель:
<ContentControl Content="{Binding ViewModelSelector}" />
[ 1113] Как только свойство ViewModelSelector
вернет FirstViewModel
, наш заполнитель покажет FirstControl
. Если мы перейдем к свойству ViewModelSelector
в SecondViewModel
, наш заполнитель автоматически заменит FirstControl
на SecondControl
и наоборот.