【发布时间】:2018-10-16 12:53:26
【问题描述】:
WPF 应用程序,使用 Prism。
我正在使用多阶段模块初始化程序,并且在模块的初始化过程中,我希望模块能够自我检查视图并注册其中定义的任何区域。
我正在使用类似于以下代码的代码来自我检查视图模型类并注册其他内容,但我不知道如何反映到视图中。
protected void SelfInspectRegions()
{
var assm = Assembly.GetAssembly(this.GetType()).GetTypes();
foreach (var type in assm)
{
if(type.IsSubclassOf(typeof(UserControl)))
{
var a = type;
}
}
}
下面是我想自行注册的基于选项卡的区域(在视图/用户控件上定义)的示例;
<controls:ChTabControlModelAware x:Name="OrderProcessingDocumentDetailRegion"
cal:RegionManager.RegionManager="{Binding RegionManager, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type shells:FormShell}}}"
cal:RegionManager.RegionName="Order Processing:DocumentDetailRegion"
cal:RegionManager.RegionContext="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="1" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<bindings:EventToCommandBehavior.EventBindings>
<bindings:EventBinding Command="{Binding SelectedDetailTabChangedCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=controls:TabControl}, Path= SelectedItem.DataContext.HeaderInfo}"
EventName="SelectionChanged" RaiseOnHandledEvents="True"
PassEventArgsToCommand="True" />
</bindings:EventToCommandBehavior.EventBindings>
</controls:ChTabControlModelAware>
主要我想提取该行中定义的 RegionName;
cal:RegionManager.RegionName="Order Processing:DocumentDetailRegion"
我不知道该怎么做,如果有任何帮助,我们将不胜感激
非常感谢
兰斯
2018 年 17 月 10 日更新:我想要实现的目标。
我正在编写一个 WPF 应用程序框架,其中包含大约 30 个模块(并且正在扩展),它们都订阅和注入服务。
我的所有区域都在视图中声明,并且有很多。由于我的框架中的开发要求,现在模块需要在模块初始化阶段预先注册它们的区域。原因之一是某些服务以特定区域为目标,并且每个主机都具有独特的操作设置。目前主机模块负责设置,这意味着如果对服务的操作设置进行更改,则需要在模块和项目之间进行大量剪切和粘贴。通过主机预注册,在模块初始化中,服务模块知道哪些模块使用它的服务,并且可以将设置类注入到主机模块设置视图模型中以供用户交互。操作设置的更改只需要在服务模块中修改,而不是在使用它的所有各种主机模块中。
我一直在寻找一种简单的方法来从众多模块程序集中提取名称,而无需显式声明它们或使用声明性属性装饰视图模型。
【问题讨论】:
-
RegionName 是在 DependencyObject 上设置的附加属性,例如一个 ChTabControlModelAware 实例。你不能从课堂上得到它。
-
我会建议你一个更好的方法:不要将区域名称定义为 XAML 中的字符串常量。相反,创建一个包含
public const strings 和区域名称的static class RegionNames。然后,您可以在 XAML 中使用x:Static设置区域名称,并在初始化时使用反射从RegionNames类中获取所有名称。 -
你想达到什么目的?
RegionManager.RegionName="SomeRegionName"通常会将控件注册为区域管理器。
标签: c# wpf reflection prism region-management