0

我将 Silverlight 5 与 Prism 和 MEF 一起使用。

我试图通过读取 XAML 文件在运行时替换我的 shell,从中创建一个 UIElement 并用新的 UIElement 替换旧 shell 的内容。我正在使用XamlReader.Load()这个。

这有效,直到我尝试创建 Prism 区域。

我可以创建一个只有一个棱镜区域的新外壳,但是当我在新外壳中有两个或更多区域时,我得到的只是浏览器中的一个空白屏幕,并且没有错误消息。

有没有办法调试这个?为什么会这样?

代码:

创建 UIElement 并替换 shell(在 Shell.xaml.cs 中):

 DependencyObject rootObject = XamlReader.Load(XAMLFileString) as DependencyObject;
 UIElement customShell = rootObject as UIElement;
 this.Content = customShell;

这有效(一个地区):

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:prism="http://www.codeplex.com/prism">

    <StackPanel>            
        <ContentControl  prism:RegionManager.RegionName="Region1"/>
    </StackPanel>

</UserControl>

这也有效(两个常规内容控件):

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:prism="http://www.codeplex.com/prism">

    <StackPanel>
        <ContentControl Content="C1"/>
        <ContentControl Content="C2"/>
    </StackPanel>
</UserControl>

但这给了我一个空白屏幕(两个棱镜区域):

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:prism="http://www.codeplex.com/prism">

    <StackPanel>            
        <ContentControl  prism:RegionManager.RegionName="Region1"/>
        <ContentControl  prism:RegionManager.RegionName="Region2"/>
    </StackPanel>

</UserControl>
4

1 回答 1

0

我弄清楚了问题所在:实际上有一个异常,但它在 App.xaml.cs 中被静默处理:

Microsoft.Practices.Prism.Regions.Behaviors.RegionCreationException: An exception occurred while creating a region with name 'Region1'. The exception was: System.ArgumentException: Region with the given name is already registered: 

抛出异常是因为我试图创建一个名称已存在于我的原始 Shell 中的区域。更改区域名称后,一切正常。

我仍然不知道为什么我得到一个有两个区域但没有一个区域的白屏(两个区域都抛出了相同的异常,所以一个区域也不应该工作)。

要将一个 shell 替换为另一个具有相同区域名称的 shell,可以在替换 shell 之前取消注册这些区域:

_regionManager.Regions.Remove(regionname)
于 2012-10-18T11:43:30.750 回答