商道如狼道 发表于 2024-9-2 19:59:26

wpf prism 《3》 弹窗 IOC

传统的弹窗 这种耦合度高

new 窗体() . Show();
new 窗体() . ShowDialog();
使用Prism 主动的 IOC 弹窗的 必须 必须 必须 页面控件

https://i-blog.csdnimg.cn/direct/162922a2132e4a90abcc3171cca3f71f.png
弹窗的 必须 必须 必须 页面控件
弹窗的 必须 必须 必须 页面控件
弹窗的 必须 必须 必须 页面控件
弹窗的 必须 必须 必须 页面控件
》》否则 报上面的错误
https://i-blog.csdnimg.cn/direct/97fada087ecd446c85bfa4381f6deb34.png
https://i-blog.csdnimg.cn/direct/b934f3b3d57f4dc0b76025988f15a512.png
》》主步伐
<Window x:Class="BlankApp2.Views.MainView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:prism="http://prismlibrary.com/"
      prism:ViewModelLocator.AutoWireViewModel="True"
      Title="{Binding Title}" Height="350" Width="525" >
    <Grid>
      <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition></RowDefinition>
      </Grid.RowDefinitions>
      <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="10">
            <Button Content="弹窗1" Command="{Binding OpenCommand}" CommandParameter="Popup"></Button>
            <Button Content="弹窗2" Command="{Binding OpenCommand}" CommandParameter="UCPopup"></Button>
            <!--<Button Content="模块Student" Command="{Binding OpenCommand}" CommandParameter="ViewXX"></Button>
            <Button Content="模块C" Command="{Binding OpenCommand}" CommandParameter="ViewC"></Button>
            <Button Content="回退" Command="{Binding BackCommand}"></Button>-->
      </StackPanel>
      <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>

》》主步伐对应的 ViewModel
using Prism.Commands;
using Prism.Dialogs;
using Prism.Mvvm;
using Prism.Navigation;
using Prism.Navigation.Regions;
using System;
namespace BlankApp2.ViewModels
{
    public class MainViewModel : BindableBase
    {
      private string _title = "Prism Application";
      public string Title
      {
            get { return _title; }
            set { SetProperty(ref _title, value); }
      }
      public DelegateCommand<string> OpenCommand { get; private set; }
      public IDialogService DialogService { get; }
      public MainViewModel(IDialogService dialogService)
      {
            this.DialogService = dialogService;
            this.OpenCommand = new DelegateCommand<string>(Open);

      }
      private void Open(string obj)
      {
            //传递给弹窗的参数信息
            DialogParameters keys = new DialogParameters();
            keys.Add("zen", "============zen============");
            DialogService.ShowDialog(obj, keys, callback =>
            {
                if (callback.Result == ButtonResult.OK)
                {   
                   //弹窗传递的参数信息
                  string ss = callback.Parameters.GetValue<string>("Info");
                }
            });
      }


    }
}
》》》弹窗用户控件 、弹窗的ViewModel
https://i-blog.csdnimg.cn/direct/6f700b70767440a3b4afdfe99870d646.png
<UserControl x:Class="BlankApp2.Views.UCPopup"
             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:BlankApp2.Views"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
      <Grid.RowDefinitions>
            <RowDefinition Height="20"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="80"></RowDefinition>
      </Grid.RowDefinitions>
      <TextBlock Text="{Binding Title}"></TextBlock>
      <TextBlock Text="弹窗信息" FontSize="40" Grid.Row="1"></TextBlock>
      <StackPanel Orientation="Horizontal" Margin="10" HorizontalAlignment="Right" Grid.Row="2">
            <Button Content="确   定" Margin="10" Command="{Binding OKCommand}"></Button>
            <Button Content="取   消" Margin="10" Command="{Binding CancelCommand}"></Button>
      </StackPanel>
    </Grid>
</UserControl>

using Prism.Commands;
using Prism.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BlankApp2.ViewModels
{
    public class UCPopupViewModel : IDialogAware
    {
      public string Title { get; set; }
      public DialogCloseListener RequestClose { get; set; }
      public DelegateCommand CancelCommand { get; set; }
      public DelegateCommand OKCommand { get; set; }
      public UCPopupViewModel()
      {
            CancelCommand = new DelegateCommand(Cancel);
            OKCommand = new DelegateCommand(OKcmd);
      }
      private void OKcmd()
      {
            DialogParameters keys = new DialogParameters();
            keys.Add("Info", "======INDO==========");
            RequestClose.Invoke(keys, ButtonResult.OK);
      }

      private void Cancel()
      {
            RequestClose.Invoke(ButtonResult.Cancel);
      }
      //是否准许关闭弹窗
      public bool CanCloseDialog()
      {
            return true;
      }
      //弹窗关闭时【窗体哪个 X】
      public void OnDialogClosed()
      {
            DialogParameters keys = new DialogParameters();
            keys.Add("Info", "======INDO==========");
            RequestClose.Invoke(keys, ButtonResult.OK);
            //throw new NotImplementedException();
      }
      //弹窗弹出时触发
      public void OnDialogOpened(IDialogParameters parameters)
      {
            if (parameters.ContainsKey("zen"))
            {
                this.Title = parameters.GetValue<string>("zen");
            }
            //throw new NotImplementedException();
      }
    }
}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: wpf prism 《3》 弹窗 IOC