首页 > 其他分享 >Prism 五Regions区域

Prism 五Regions区域

时间:2024-10-28 10:49:59浏览次数:4  
标签:regionManager Windows xaml System Regions Prism 区域 using MainWindow

1、NuGet安装Prism.DryIoc,如下图。项目使用.NET8。

2、修改App.xaml代码如下。

<prism:PrismApplication x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

3、修改App.xaml.cs代码如下。

using System.Configuration;
using System.Data;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }
    }

}

4、修改MainWindow.xaml文件,在文件中添加xmlns:prism="http://prismlibrary.com/"引用,添加<ContentControl prism:RegionManager.RegionName="ContentRegion"/>,定义一个名称为ContentRegion的区域。代码如下。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:prism="http://prismlibrary.com/"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <ContentControl prism:RegionManager.RegionName="ContentRegion"/>
    </StackPanel>
</Window>

5、Prism中不是所有的WPF控件都可以定义区域,比如当我们想使用StackPanel控件定义一个区域的话,就需要进行一下操作。

5.1、首先定义一个类StackPanelRegionAdapter.cs,代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows;

namespace WpfApp1
{
    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        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();
        }
    }
}

5.2、在App.xaml.cs对StackPanelRegionAdapter类进行注册,代码如下。

using System.Configuration;
using System.Data;
using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }
        protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)
        {
            base.ConfigureRegionAdapterMappings(regionAdapterMappings);
            regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());
        }
    }

}

5.3、MainWindow.xaml引入与上面的方法一样,代码如下。下面的代码中定义了一个名为ContentRegion的区域。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:prism="http://prismlibrary.com/"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <StackPanel prism:RegionManager.RegionName="ContentRegion" />
    </StackPanel>
</Window>

6、将用户控件添加到区域当中。

6.1.1、添加一个用户控件UCView1.xaml,代码如下。

<UserControl x:Class="WpfApp1.UCView1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApp1"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBlock Text="UCView1" FontSize="36"/>
    </Grid>
</UserControl>

6.1.2、MainWindow.xaml.cs中修改代码如下。

using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow(IRegionManager regionManager)
        {
            InitializeComponent();
            // 将用户控件UCView1注册到ContentRegion区域
            regionManager.RegisterViewWithRegion("ContentRegion", typeof(UCView1));
        }
    }
}

6.1.3、运行效果如下图所示。

7、通过按钮将用户控件添加到区域。

7,1、在 MainWindow.xaml中添加一个按钮,代码如下。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:prism="http://prismlibrary.com/"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Button Content="添加UCView" Click="Button_Click" HorizontalAlignment="Center" Width="200" Height="30" Margin="0,5,0,0"/>
        <StackPanel prism:RegionManager.RegionName="ContentRegion" />
    </StackPanel>
</Window>

7.2、MainWindow.xaml.cs代码修改如下。

using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        IContainerExtension _container;
        IRegionManager _regionManager;
        public MainWindow(IContainerExtension container, IRegionManager regionManager)
        {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var view = _container.Resolve<UCView1>();
            IRegion region = _regionManager.Regions["ContentRegion"];
            region.Add(view);
        }
    }
}

7.3、运行效果如下图。

8、 区域中激活用户控件和停用用户控件。注意这里使用的区域是ContentControl而不是StackPanel。

8.1、MainWindow.xaml代码如下。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:prism="http://prismlibrary.com/"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Button Content="添加UCView" Click="Button_Click" HorizontalAlignment="Center" Width="200" Height="30" Margin="0,5,0,0" Tag="Active"/>
        <Button Content="停用UCView2" Click="Button_Click"  HorizontalAlignment="Center" Width="200" Height="30" Margin="0,5,0,0" Tag="Deactive"/>
        <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    </StackPanel>
</Window>

8.2、MainWindow.xaml.cs代码如下

using Prism.Navigation.Regions;
using System.Windows;
using Prism.Ioc;
using System.Windows.Controls;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        IContainerExtension _container;
        IRegionManager _regionManager;
        IRegion _region;
        UCView1 _view1;
        public MainWindow(IContainerExtension container, IRegionManager regionManager)
        {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;

            this.Loaded += MainWindow_Loaded;
        }
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            _view1 = _container.Resolve<UCView1>();

            _region = _regionManager.Regions["ContentRegion"];

            _region.Add(_view1);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;

            if (btn.Tag.ToString() == "Deactive")
            {                
                _region.Deactivate(_view1);
            }
            else
            {
                _region.Activate(_view1);
            }
        }
    }
}

8.3、运行效果如下图。

标签:regionManager,Windows,xaml,System,Regions,Prism,区域,using,MainWindow
From: https://blog.csdn.net/xingchengaiwei/article/details/142380846

相关文章

  • 【最新华为OD机试E卷-支持在线评测】机器人活动区域(200分)多语言题解-(Python/C/Java
    ......
  • Qt/C++地图雷达扫描/动态扇形区域/标记线实时移动/轮船货轮动态轨迹/雷达模拟/跟随地
    一、前言说明地图雷达扫描的需求场景也不少,很多人的做法是直接搞个覆盖层widget,在widget上绘制雷达,优缺点很明显,优点是性能高,毕竟直接在widget上绘制性能明显比js中绘制要高,缺点是要么动态计算经纬度坐标转屏幕坐标来实现跟随,要么固定的通过改变绘制的范围内容来跟随,但是总归使用......
  • PCL 计算点云重叠区域的均值标准差
    目录一、概述1.1原理1.2实现步骤1.3应用场景二、代码实现2.1关键函数2.1.1计算均值和标准差的函数2.2完整代码三、实现效果PCL点云算法汇总及实战案例汇总的目录地址链接:PCL点云算法与项目实战案例汇总(长期更新)一、概述        在点云配准中,评估配准......
  • 厂房区域人员进出人数统计-实施方案
    1.1现状分析传统的人流量统计方法往往依赖于人工计数或简单的视频监控系统,这些方法不仅效率低下,而且容易出错,无法满足现代仓库管理的需求。因此,我厂区决定引入先进的智能监控系统,通过集成高清摄像头、GPU服务器和人流量统计算法,实现对厂房区域人员进出数量的实时监测和精......
  • 判断检测框是否在感兴趣区域(ROI)内
    判断检测框是否在感兴趣区域(ROI)内在计算机视觉和图像处理中,我们经常需要确定一个矩形检测框是否位于一个特定的感兴趣区域(RegionofInterest,ROI)内。这个ROI可以是一个多边形,而检测框则是一个矩形。本文将探讨如何判断一个矩形是否完全位于一个多边形内,并提供Python和C++......
  • 图片区域点击处理
    如果给你一张这样的图片,要求你点击到黑色圆圈时改变点击的圆圈颜色(选中状态)设计UI会给一套选中图,尺寸一致,只有选中的圆圈不同直观的实现方案,使用三个透明View,固定在三个圆圈上方位置,点击时设置点击选中的状态弊端就是如果圆圈多了,需要固定多个View,并且如果圆圈位置发生了改变,每个......
  • Vue2 - 完美解决html2canvas截图不全问题,截屏导出的图片显示不全只有一部分或缺一块,vu
    前言该解决方案任意前端技术栈通用,不仅限Vue。在vue2(手机H5移动端/微信公众号H5页面)项目开发中,使用html2canvas截屏时发现有一部分未截取到少了一块截图不完整,导出保存图片时发现截图只有一半显示不全,另外还有一个问题就是截图时截取当前可视区域的问题(出现滚动条只保......
  • CesiumJS 案例 P6:添加图片图层、添加图片图层并覆盖指定区域
    CesiumJSCesiumJSAPI:https://cesium.com/learn/cesiumjs/ref-doc/index.htmlCesiumJS是一个开源的JavaScript库,它用于在网页中创建和控制3D地球仪(地图)一、添加图片图层<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"......
  • 越界检测视频分析网关区域入侵识别人员入侵算法的技术原理和视频监控应用
    在传统的监控模式下,依赖人工持续监视视频画面存在明显的局限性,包括疲劳、注意力分散以及无法覆盖所有区域等问题,这使得实现24小时、全方位监控变得困难。而人工智能技术的应用,通过在关键位置部署摄像头,能够捕获连续的视频流。结合深度学习模型,这些视频流可以被实时分析,从而提高了......
  • 22年计挑赛Python组区域赛个人解答
    第一题:代码部分:生产问题A=100;B=150;List=[]a,b,c,d,e,f,g,h,i=map(int,input().split())list=[a,b,c,d,e,f,g,h,i]forminrange(min(g//a,h//b,i//c)+1):n=min((g-m*a)//e,(h-m*b)//f,(i-m*c)//f)w=A*m+B*nList.append(w);List.append(m);......