博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Prism定制Region控件
阅读量:5334 次
发布时间:2019-06-15

本文共 2756 字,大约阅读时间需要 9 分钟。

原文:

并不是所有控件都可以被用作Region了吗?我们将Gird块的代码变成这样:

似乎看上去一切正常,让我们来启动他。

Oops!!!程序并没有按照我们想象的那样启动,而是抛给了我们一个异常:

Prism.Regions.UpdateRegionsException: 'An exception occurred while trying to create region objects.

Prism在生成一个Region对象的时候报错了,看上去,StackPanel并不支持用作Region。那么有其他的方法让他可以被用作Region吗?因为我们很喜欢用StackPanel啊( ﹁ ﹁ ) ~→(不要管我为什么喜欢,你不,我就偏要) 这难不倒Prism,毕竟创建Region对象就是他自己的事情,做分内的事应该没问题的。

你需要为一个将被用作Region的添加RegionAdapter(适配器)。RegionAdapter的作用是为特定的控件创建相应的Region,并将控件与Region进行绑定,然后为Region添加一些行为。一个RegionAdapter需要实现IRegionAdapte接口,如果你需要自定义一个RegionAdapter,可以通过继承RegionAdapterBase类来省去一些工作。

那,为什么ContentControl就可以呢?因为:

The Composite Application Library provides three region adapters out-of-the-box:

  • ContentControlRegionAdapter. This adapter adapts controls of type System.Windows.Controls.ContentControl and derived classes.
  • SelectorRegionAdapter. This adapter adapts controls derived from the class System.Windows.Controls.Primitives.Selector, such as the System.Windows.Controls.TabControl control.
  • ItemsControlRegionAdapter. This adapter adapts controls of type System.Windows.Controls.ItemsControl and derived classes.

因为这三个是内定的(蛤蛤),就是已经帮你实现了RegionAdapter。接下来,我们看看怎么为StackPanel实现RegionAdapter。

  • step1 新建一个类StackPanelRegionAdapter.cs,继承RegionAdapterBase ,这个类已经帮我们实现了IRegionAdapte接口。
using Prism.Regions;using System.Windows;using System.Windows.Controls;namespace Regions.Prism{    public class StackPanelRegionAdapter : RegionAdapterBase
{ public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory) { } protected override void Adapt(IRegion region, StackPanel regionTarget) { region.Views.CollectionChanged += (s, e) => { if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) { foreach (FrameworkElement element in e.NewItems) { regionTarget.Children.Add(element); } } //handle remove }; } protected override IRegion CreateRegion() { return new AllActiveRegion(); } }}
  • setp2App.xaml.cs注册绑定
    [7.1updated]
protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)        {            base.ConfigureRegionAdapterMappings(regionAdapterMappings);            regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve
()); }

我们现在可以为StackPanel实现用作Region了。我们再运行刚才抛给我们异常的程序,是不是已经跑起来了呢?

posted on
2019-04-05 00:49 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10657748.html

你可能感兴趣的文章
iOS resign code with App Store profile and post to AppStore
查看>>
python 表格操作
查看>>
LeetCode 84. Largest Rectangle in Histogram
查看>>
LeetCode Two Sum III - Data structure design
查看>>
session和xsrf
查看>>
Failed to initialize NVML: GPU access blocked by the operating system
查看>>
Ant Trip HDU - 3018(欧拉路的个数 + 并查集)
查看>>
wireshark问题现象分析
查看>>
【转载】JAVA IO 流的总结
查看>>
TensorFlow---image recognition--classify_image运行、文件说明与错误(路径)解决
查看>>
原生JavaScript封装Ajax
查看>>
2016年7月总结
查看>>
一周学会Mootools 1.4中文教程:(1)Dom选择器
查看>>
Cookie与Session
查看>>
配置redis外网可访问
查看>>
haproxy 配置https 同时技持443 80端口
查看>>
js正则备忘
查看>>
跟随大神实现简单的Vue框架
查看>>
Linux目录结构
查看>>
learning awk
查看>>