У меня есть Основной проект, который будет загружать другие проекты с MEF в соответствии с «Ролью» актера, который выполнил вход в систему, например:
, если имя пользователя - «project1», я загружу проект1 иего соответствующие XAP, Models, ViewModels и Views.
Так что мне нужно изменить свой App.RootVisual и настроить MainPage в соответствии с текущим проектом.
Я искал решенияв интернете и нашел почти одинаковые вещи, сделанные разными способами, и я попробовал это:
Сначала я установил свой RootVisual в качестве сетки на Application_Startup:
Grid grid = new Grid();
this.RootVisual = grid;
grid.Children.Add(new MainPage());
Итак, после моих методов аутентификацииверните мне, какой проект я должен загрузить, я делаю это:
var grid = App.Current.RootVisual as Grid;
grid.Children.RemoveAt(0);
grid.Children.Add(new Project1MainPage());
Я создал ContentControl на моей главной странице, который привязан к DependencyProperty:
<ContentControl Name="region1ContentControl" Content="{Binding Path=MainContent}" Style="{StaticResource ContentControlStyle}" Grid.Row="1" Margin="0,30" />
В этом ContentControl я загружаю всемои представления, поэтому у меня есть это на всех главных страницах моего проекта, и все они связаны с Dp с именем MainContent, как показано выше.
Поэтому, когда я изменяю свой RootVisual нановый ProjectMainPage работает нормально, но когда я пытаюсь загрузить представление на свой ContentControl, я получаю это:
со следующим InnerException:
{System.InvalidOperationException: Element is already the child of another element.
em MS.Internal.XcpImports.CheckHResult(UInt32 hr)
em MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh)
em MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty property, Object obj)
em System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value)
em System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty property, EffectiveValueEntry& newEntry, Object newValue)
em System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
em System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp)
em System.Windows.Data.BindingExpression.SendDataToTarget()
em System.Windows.Data.BindingExpression.SourcePropertyChanged(PropertyPathListener sender, PropertyPathChangedEventArgs args)
em System.Windows.PropertyPathListener.ReconnectPath()
em System.Windows.Data.Debugging.BindingBreakPoint.<>c__DisplayClass4.<BreakOnSharedType>b__3()}
и StackTrace:
em System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
em System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
em System.Delegate.DynamicInvokeImpl(Object[] args)
em System.Delegate.DynamicInvoke(Object[] args)
em MainPagexaml_9.BindingOperation(Object BindingState, Int32 , Action )
Кто-нибудь знает, что я могу сделать или другое решение, чтобы изменить пользовательский интерфейс ??Надеюсь, я был ясен по моему вопросу, спасибо!