zoukankan      html  css  js  c++  java
  • Fastto.Word P11 Ninject 和 进行项目分离.

    1,PowerCommands for Visual Studio

    https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.PowerCommandsforVisualStudio

    • Copy As html
    • Double Click Maxmum
    • Fix Mixed Tab
    • Power Commands For Visual Studio

    2,.EditorConfig---For good code style

    在FesstoWord全局中进行定义,不怎么明白.

    3,ctrl+T to goto files.Ctrl+Shift+H进行全局替换.ctrl+Shit+B 重建.


    4,create local rep

    mkdir my-fesetto-word
    cd my-fesetto-word
    git init
    touch README.md
    git add README.md
    git commit -m "first commit"
    git remote add origin https://gitee.com/mao_qin_bin/my-fesetto-word.git
    git push -u origin master

    5,git to arealdy rep

    cd existing_git_repo
    git remote add origin https://gitee.com/mao_qin_bin/my-fesetto-word.git
    git push -u origin master

    6,Copy黏贴 LogoPage生成RegisterPage并且更改相应东西

    <local:BasePage x:Class="Fasetto.Word.RegisterPage" x:TypeArguments="core:LoginViewModel"
          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:Fasetto.Word"
          xmlns:core="clr-namespace:Fasetto.Word.Core;assembly=Fasetto.Word.Core"
    
          mc:Ignorable="d"
          d:DesignHeight="700" d:DesignWidth="700"
          Title="RegisterPage"
          x:Name="Page">
    
        <Border >
            <Grid >
    
                <!--Main content scroll-->
                <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                    <StackPanel VerticalAlignment="Center"
                                HorizontalAlignment="Center"
                                TextBlock.TextAlignment="Center">
    
                        <!--Login main content whit box-->
                        <Border Background="{StaticResource ForegroundLightBrush}" CornerRadius="10" Padding="15 50 15 15" Width="300" Margin="50 50 50 0">
                            <StackPanel Margin="0 0 0 10">
                                <TextBlock
                                       FontSize="{StaticResource FontSizeXXLarge}"
                                       FontFamily="{StaticResource LatoRegular}"
                                       Foreground="{StaticResource WordBlueBrush}" ><Run Text="Sign "/><Run Text="Up"/></TextBlock>
    
                                <TextBlock Text="It's about to get fun"
                                           FontSize="{StaticResource FontSizeLarge}"
                                           Foreground="{StaticResource ForegroundDarkBrush}"
                                           Margin="0 0 0 30"/>
                                <!--Email-->
                                <TextBox Tag="Email" Text="{Binding Email}" />
                                <!--Password-->
                                <PasswordBox x:Name="PasswordText" Tag="Password"  Password=""/>
                                <!--Next Button-->
                                <Button local:IsBusyProperty.Value="{Binding LoginIsRunning}"  Content="Register" HorizontalAlignment="Center"  Command="{Binding LoginCommand}"  CommandParameter="{Binding ElementName=Page}"
                                        Margin="0 50 0 0" />
                            </StackPanel>
                        </Border>
                        <!--have a account-->
                        <Button Style="{StaticResource TextButton}"
                                Command="{Binding RegisterCommand}"
                                Content="Or,already have a account..."
                                HorizontalAlignment="Center"/>
                    </StackPanel>
                </ScrollViewer>
            </Grid>
        </Border>
    
    </local:BasePage>

    7,进行项目分离,将非wpf 代码分离出来.

    image

    并在新的项目中安装Fody以支持ViewModel的类绑定.

    image


    BaseViewModel

     /// <summary>
        /// used to generate INotifyPropertyChanged Auto
        /// </summary>
        [AddINotifyPropertyChangedInterface]
    
        public class BaseViewModel : INotifyPropertyChanged
        {
            /// <summary>
            /// the event fired when any child property changes its value
            /// </summary>
            public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
    
            /// <summary>
            /// call this to fire a<see cref="PropertyChanged"/>event
            /// </summary>
            /// <param name="name"></param>
            public void OnPropertyChanged(string name)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
            }
    
            /// <summary>
            /// runs a command if the updating flag is not set
            /// if the flag is true(the function is already running.
            /// </summary>
            /// <param name="updatingFlag"></param>
            /// <param name="action"></param>
            /// <returns></returns>
            protected async Task RunCommand(Expression<Func<bool>> updatingFlag, Func<Task> action)
            {
                //Expression.complie.get value
                if (updatingFlag.GetPropertyValue()) return;
    
                //Indicate we're running.
                updatingFlag.SetPropertyValue(true);
                try
                {
                    await action();
                }
                finally
                {
                    //set the property flag back to false now it's finished
                    updatingFlag.SetPropertyValue(false);
                }
    
            }
        }
    • 利用fody标准化绑定接口
    • 使用RunCommand进行updatingFlag属性进行互锁.注意,直接使用updatingFlag的布尔量是不起作用的.

         因为传递的是副本.而且在异步的操作里面,不能直接使用.in,out,ref.所以,可以使用Expression的方式在异步的操作里面传递.



    9,添加Ninject包

    直接打IKernel---帮助安装.


    10,添加Ioc类,并且添加ApplicationViewModel类.并且在MainWindowViewModel中删除CurrentPage属性.

    • 添加IoC类
     public static class IoC
        {
            /// <summary>
            /// the Ioc Kernel for Application.
            /// </summary>
            public static IKernel Kernel { get; set; } = new StandardKernel();
    
            /// <summary>
            /// Set Up Ioc Container
            /// Must be called as soon as Application startup
            /// </summary>
            /// 
            public static void Setup()
            {
                //Binds all required Viewmodels();
                BindViewModels();
            }
    
    
            /// <summary>
            /// Add BindViewModels
            /// </summary>
            private static void BindViewModels()
            {
                //Add the ApplicationViewMOdel to the IoC Service
                Kernel.Bind<ApplicationViewModel>().ToConstant(new ApplicationViewModel());
            }
    
            /// <summary>
            /// Get the ViewModel
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            public static T Get<T>()
            {
                return Kernel.Get<T>();
            }
        }
    • 添加ApplicationViewModel类
     public class ApplicationViewModel: BaseViewModel
        {
            public ApplicationPage CurrentPage { get; set; } = ApplicationPage.Login;
        }

    11,在Fasseto.Word项目中增加ApplicationLocator类,用来绑定和获取ApplicationViewModel.

    • 添加ApplicationLocator类
     public  class ApplicationLocator
        {
    
            public static ApplicationLocator Instance => new ApplicationLocator();
            public  ApplicationViewModel ApplicationViewModel => IoC.Get<ApplicationViewModel>();
        }



    12.在App.xaml中,删除startupuri,并且 在程序中 override StartUp(),在其中进行Ioc.SetUp(),注册服务.

     public partial class App : Application
        {
            protected override void OnStartup(StartupEventArgs e)
            {
                //base StartUp
                base.OnStartup(e);
    
                //SetUp the IoC
                IoC.Setup();
    
                //Create Page and Show
    
                Application.Current.MainWindow = new MainWindow();
                Application.Current.MainWindow.Show();
            }
        }

    13,在MainWindow.xaml中,设置Source=ApplicationLocator.Instance.设置Path=ApplicationViewModel.CurrentPage.

     <Frame Grid.Column="1"
                       x:Name="MainFrame"
                       Content="{Binding ApplicationViewModel.CurrentPage,
                       Source={x:Static local:ApplicationLocator.Instance},
                       Converter={local:ApplicationPageValueConverter}}" 
                 />

    14,在LoginViewModel中设置Page切换

    • 新建RegisterCommand Property
    • 在构造中进行赋值
    • RegisterCommand = new RelayCommand(async () => await RegisterAsync());
      
    • 在RegisterAsync()中进行切换界面
     public async Task RegisterAsync()
            {
    
                //Get the Ioc Service
                var windowViewModel = IoC.Get<ApplicationViewModel>();
    
                //Change the Page to Show
                switch (windowViewModel.CurrentPage)
                {
                    case ApplicationPage.Login:
                        windowViewModel.CurrentPage = ApplicationPage.Register;
                        break;
                    case ApplicationPage.Register:
                        windowViewModel.CurrentPage = ApplicationPage.Login;
                        break;
                }
                await Task.Delay(2000);
                //TODO:GOTO Register Page
            }
    

    15,最终效果图

    image

  • 相关阅读:
    c# 使用MySql的MySqlBulkCopy 出现异常 Loading local data is disabled; this must be enabled on both the client and server sides
    DB2 使用EF Core 查询数据 报错 Object reference not set to an instance of an object.
    关于iis部署的网站访问类型设置
    ABP put与delete类型请求异常 TypeErorr: Failed to fetch
    This request has been blocked; the content must be served over HTTPS.
    Mysql Select的字段必须包含在Group By中如何解决
    企业微信小程序-临时登录凭证校验(code2Session)中获取的userid是加密的
    ABP System.ObjectDisposedException: Cannot access a disposed object.
    SQL server数据库文件(mdfldf)的迁移
    A second operation started on this context before a previous operation completed--ABP
  • 原文地址:https://www.cnblogs.com/frogkiller/p/14483746.html
Copyright © 2011-2022 走看看