WPF Calibun.Micro 笔记(一)

14 篇文章 0 订阅
13 篇文章 0 订阅

前文:由于WPF 框架有很多,用到的我也就用到了 MVVM \MVVM.TOLKIT \Prsim\Caliburn.Micro 之前写那些框架的时候都有很多注解,但是CM的我感觉正规一定 很少。我就把我学的笔记做一下! 望各位进行学习!!!如遇到疑问,请多多指教,我会进行改正!!!

一、添加Nuget包
1、 Caliburn Micro

在这里插入图片描述

二、修改App.xml
1、 删除启动:Startui=“xxxMain.xaml”
2、填充资源 : Bootstrapper:新建的类 看第三节


```csharp
 <ResourceDictionary>
                    <locals:Bootstrapper x:Key="bootstrapper"/>
                </ResourceDictionary>        
<Application x:Class="WPFUI.Control.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPFUI.Control"
             xmlns:locals="clr-namespace:WPFUI.Control.Micro"
          >
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <locals:Bootstrapper x:Key="bootstrapper"/>
                </ResourceDictionary>               
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>


三、新建Bootstrapper类
新建的类如下:


```csharp
namespace WPFUI.Control.Micro
{
    public class Bootstrapper:BootstrapperBase
    {
        private SimpleContainer container = new SimpleContainer();
        public Bootstrapper()
        {
            Initialize();
            StartDebugLogger();

        }

        // [Conditional("DEBUG")] You can use this conditional starting with C# 9.0
        public static void StartDebugLogger()
        {
            LogManager.GetLog = type => new DebugLog(type);
        }

        /// <summary>
        /// 配置  用于 view与 viewModel之间的bingding     覆盖以配置框架并设置IoC容器。
        /// </summary>
        protected override void Configure()
        {
            
            container.Instance(container);
            container.Singleton<IWindowManager, WindowManager>();
            container.Singleton<IEventAggregator, EventAggregator>();


         
            //利用反射 自动反射模型
            foreach (var assembly in SelectAssemblies())
            {
                assembly.GetTypes()
               .Where(type => type.IsClass)
               .Where(type => type.Name.EndsWith("ViewModel"))
                .ToList()
               .ForEach(viewModelType => container.RegisterPerRequest(
                   viewModelType, viewModelType.ToString(), viewModelType));
            }
        }
        /// <summary>
        /// 覆盖此项以提供特定于IoC的实现。
        /// </summary>
        /// <param name="service"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        protected override object GetInstance(Type service, string key)
        {
      
            return container.GetInstance(service, key);
        }
        /// <summary>
        /// 覆盖此项以提供特定于IoC的实现
        /// </summary>
        /// <param name="service"></param>
        /// <returns></returns>
        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return container.GetAllInstances(service);
        }

        /// <summary>
        /// 覆盖此项以提供特定于IoC的实现
        /// </summary>
        /// <param name="instance"></param>
        protected override void BuildUp(object instance)
        {
            container.BuildUp(instance);
        }

        /// <summary>
        /// 启动项
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="e"></param>
        protected override async void OnStartup(object obj, StartupEventArgs e)
        {
            var c = IoC.Get<SimpleContainer>();
            //定位视图模型,定位关联视图,绑定它们并将其显示为根视图。
            await DisplayRootViewForAsync(typeof(LogInWIndowViewModel));
        }




    }
}

四、如何bingding
1、关于view与ViewModel
在Caliburn Micro 中,不需要进行view与viewmodel之间进行绑定,此CM中自带可绑定事件。

2、关于按钮命令如何在ViewModel进行bingding
xmal中写法:

 <Button Content="&#xe600;" x:Name="LoginBtn"  Grid.Row="2" VerticalAlignment="Top"  
         Margin="-50 0 0 0" FontSize="15" Style="{StaticResource MosePressAnimation_Btn}"  
         HorizontalAlignment="Center" Foreground="White"/>

在viewModel中写法:

public class LogInWIndowViewModel : Screen
    {
       

        public LogInWIndowViewModel()
        {
            
        }

        /// <summary>
        /// 登录
        /// </summary>

        public void LoginBtn()
        {
            MessageBox.Show($"{UserName} + {Password}");
        
        }
    }
}

注意:是根据XAML中元素名称( x:Name)进行与viewmodel中进行binding的。
3、关于数据更新 Screen
具体使用 看上一个节点

//[AddINotifyPropertyChangedInterface] 因为Screen 继承了INotifyPropertyChanged 所以这句就不用加了

4、文本之间如何bingding
前端:

 <TextBox Text="{Binding UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" Width="80" FontSize="13" Height="22" TextAlignment="Center" Padding="0" Foreground="White" BorderThickness="0 0 0 2" Background="Transparent" VerticalAlignment="Center"/>

ViewModel:

 public class LogInWIndowViewModel : Screen
    {
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; } = "admin";
      

        public LogInWIndowViewModel()
        {
            
        }

       
    }

5、如何启动另一个窗口与另一个窗口进行view与ViewModel 之间的注意事项
1、如何启动另一个窗口:

 public class LogInWIndowViewModel : Screen
    {
        
        private readonly IWindowManager _windowManager;
        public LogInWIndowViewModel(IWindowManager windowManager)
        {
            _windowManager = windowManager;
        }

        /// <summary>
        /// 登录 这是一个按钮命令
        /// </summary>

        public void  LoginBtn()
        {

            if (!UserInformationManSql.SelectUser(new ControlSqlData.UserNameTable() { UserName = UserName, Password = UserPassWord }))
            {
                MessageBox.Show($"用户名 或 密码错误!!!");
            }
            else {
            //启动另一个窗口视图
                 _windowManager.ShowDialogAsync(IoC.Get<UserRegistrationViewDialogViewModel>());
            }

        
        }





    }

2、View与ViewModel 之间的注意事项:
1: 在CM 之间是使用的View与Viewmodel之间自动进行上下文绑定,但是如果出现以下格式:

在View 中添加一个文件夹,在ViewModel 中就需要添加一个相同同名的文件夹即可。 这样View与ViewModel 之间就可进行数据绑定!!!
注意:一定要相同的文件路径,否则有可能找不到此文件!!!

不定时上传更新! 如有疑问,请留言,我也会更改!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值