[WPF、.NETのコア3.0上]スタイレット実証プロジェクト - シンプルなライブラリ管理システム(1)

.NETのコア3.0は、エキサイティングな機能の多くに加えて、リリースしたが、またどのように.NETのコアの経験でWPF 3.0の開発に、その後、WPFのための公式サポートが追加されましたか?

本論文では、.NETのコア3.0を開発するためのスタイレットフレームワーク上のWPFアプリケーション。スタイレットの枠組みについて、私たちは不慣れであってもよいし、それは軽量である(しかし、非常に良い!)WPFフレームワーク、最近.NETのコア3.0に更新サポートはスタイレットに導入する前に、あなたは私のブログの記事を訪問することができます:ViewModelにはとても爽やかではありませんでし-軽量WPF MVVMフレームワークのスタイレットは、この記事ではまた、MVVMとスタイレットを使用してのベストプラクティスの一部が含まれています。

簡単にするために、例としては、ユーザ認証管理や他の一般的なビジネス機能などが含まれていないデータベースを使用していないなど、フォーム検証、ウィンドウがポップアップし、結合のような一般的な機能に使用WPFアプリケーションを開発するために使用するスタイレットの主要なプロジェクトを示しています。

最新の.NETテクノロジー・スタックを使用するすべてのプロジェクトコードは、含めて完成されています。

  • VS2019
  • .NETのコア3.0
  • C#8

本論文では、新機能の一部が声明を出すでしょう。

ここでは、船の何新しいバージョンそれを理解するために私に従うことです!

予備的

  • VS2019 16.3.2
  • .NETのコアSDK 3.0.100
  • インストールスタイレットテンプレート

    オープンCMDまたはPowerShellは、次のコマンドを実行します(SDKの.NETのコア3.0がインストールされていることを確認してください):

    DOTNET新しい-i Stylet.Templates

  • プロジェクトのスタイレットを作成します

    StyletBookStore -o DOTNET新しいスタイレット

    このような使用スタイレットWPFアプリケーションが作成されています!

VS2019オープンStyletBookStore.csproj、F5キーを押して実行するには:

OK。私は良い感じ!

サインオン機能性を高めます

それが実証プロジェクトですが、我々はまだ:)ログイン画面を必要としますが、スタイレットインタフェースは、少なくとも二つの部品を必要と:.「ViewModelに」と「ビュー」は、我々はそれを達成することです。

ViewModelに

名前のフォルダの下に作成されたページのLoginViewModel.csインターフェース・ロジックは、ログインし、次のコードを入力し実装するクラス:

public class LoginViewModel : Screen
{
    /// <summary>
    /// 用户名
    /// </summary>
    public string UserName { get; set; } 

    /// <summary>
    /// 密码
    /// </summary>
    public string Password { get; set; }

    /// <summary>
    /// 登录
    /// </summary>
    public void Login()
    {
        // 在这实现登录逻辑
    }

    /// <summary>
    /// 登录的防护属性
    /// </summary>
    public bool CanLogin => !string.IsNullOrEmpty(UserName) &&
                            !string.IsNullOrEmpty(Password);
}
  • 継承クラスStylet.Screen一般的に使用されるビューモデルスタイレットの基本クラスです。
  • これは、ユーザー名とパスワードを表す、2つのパブリックプロパティを定義します。
  • 名前の定義Loginにログインするためのロジックを実装するために使用する方法を。我々は、後でそれを実現します。
  • 名前の定義CanLoginをチェックするために、財産の保護をLoginユーザー名とパスワードが入力された場合にのみ、この方法を実行できるかどうか、ログオン方法の実行を許可されています。

    財産の保護(ガードのプロパティ)は、関数スタイレットでリターンが読み取り専用のブール属性です。名前に命名規則缶+属性メソッド名の保護を。詳細については、下記をご覧ください警備隊のプロパティを

null参照のタイプを有効にします

null参照の種類を:のは、新C#8が機能を追加してみましょう。

参照タイプを使用すると、コンパイル時間基準の潜在的な問題をチェックするための空きスペースすることができます。NULL可能参照型について、前の記事の私の翻訳を参照してください8.0 C#の最初のテスト「参照型を空にする」のセクションで。

右クリックしてStyletBookStore、プロジェクトを「編集プロジェクトファイル」を選択します。

オープンStyletBookStore.csproj設定ファイルに行を追加します。

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

<PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <RootNamespace>StyletBookStore</RootNamespace>
    <UseWPF>true</UseWPF>
    <Nullable>enable</Nullable>  <!-- 启用可空引用类型 -->
</PropertyGroup>

...

</Project>

NULL可能参照型を有効にした後、プロジェクトをコンパイルし、再び2つの警告があるでしょう。

彼は私たちに警告UserNameしてPassword。初期化されていないnull参照の例外は、2つのソリューションを使用した後に発生する可能性があります。

  1. 属性の初期値を設定します

    public string UserName { get; set; } = String.Empty;
    public string Password { get; set; } = String.Empty;

    ユーザー名とパスワードの設定された初期値:null文字列

  2. プロパティはnull型として宣言することができます

    public string? UserName { get; set; }
    public string? Password { get; set; }

    ユーザー名・パスワードが空の型で特定するには?を使用

ここでは、第一の方法、空の文字列に初期化されたユーザ名とパスワードを使用しています。もう一度コンパイルし、警告が消えました。

見る

フォルダ名で作成したページのLoginView.xamlメインUIのログインコードを定義するために使用されるファイル、次のとおりです。

<Window 
    ...
    d:DataContext="{d:DesignInstance pages:LoginViewModel}" 
    >
<Grid>
    ...
    <TextBlock Grid.Row="0" Grid.Column="0" Text="用户名" Margin="5" VerticalAlignment="Center" HorizontalAlignment="Right"></TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="0" Text="密码" Margin="5" VerticalAlignment="Center" HorizontalAlignment="Right"></TextBlock>
    <TextBox Grid.Row="0" Grid.Column="1" Margin="5" Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    <PasswordBox Grid.Row="1" Grid.Column="1" Margin="5" wpf:PasswordHelper.Attach="True" wpf:PasswordHelper.Password="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></PasswordBox>
    <Button Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Content="登录" Margin="5" Padding="15 5 15 5" Command="{s:Action Login}"></Button>
</Grid>
</Window>
  • 使用するd:DataContext="{d:DesignInstance ...}"データソースがXAMLを書くときインテリジェンスのヒントを得るために、XAMLに設計されています。
  • セキュリティ上の理由から、WPFパスワードボックスは結合をサポートしていません。ここでは簡単のために、追加の拡張属性クラスの使用PasswordHelper結合パスワードを実装して具体的に閲覧してくださいPasswordHelperを
  • 使用する{s:Action Login}にバインドされたログインボタンコマンドLoginアプローチを、ので、ViewModelには、実行されるログイン方法でログインボタンを押してください。これは、スタイレットは、アクションと呼ばれる機能を提供しています。詳細については、をご覧くださいアクションとメソッドを

HotReload

VS2019は、この機能は、開発者がXAMLアプリケーションのコードが実行され、変更、および修正すぐに効果を見ることができ、XAMLは便利な機能HotReloadを追加します:

UIを設計するときにこのようにして、我々は非常に簡単になります:)

ログインロジックを実装

変更Login・サインオン機能を達成するための方法を:

        /// <summary>
        /// 登录
        /// </summary>
        public void Login()
        {
            // 设计的非常健壮的用户验证机制:)
            if (UserName != "waku" || Password != "123")
            {
                _windowManager.ShowMessageBox("用户名或密码不正确", "登录失败", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                return;
            }

            RequestClose(true);
        }
  • ユーザーがユーザー名とパスワードを入力すると、私たちは非常に満足しない堅牢なときバリデーションルール、ポップアップエラーメッセージを。

    ここで使用されWindowManager.ShowMessageBoxたメッセージダイアログを表示するようにWindowManagerスタイレットが表示ウィンドウを管理するために設計された機能を提供しています。

    使用するにはWindowManager、ViewModelにで声明IWindowManagerスタイレットを使用し、インタフェース型のメンバ変数と関数はコンストラクタによって、その中に注入IoCのインスタンスを構築しました。

        private readonly IWindowManager _windowManager;
        public LoginViewModel(IWindowManager windowManager)
        {
            _windowManager = windowManager;
        }

    だから、のViewModelにウィンドウマネージャを使用することができます

    おそらく、あなたは使用することに慣れているMessageBox.Showメッセージボックスを表示するには、しかし、一緒に結合されているあなたのViewModelとUIコンポーネントにそう、これはMVVMデザインパターンの違反である。ので、あなたはときあなたのViewModelのためのテストコードを書く必要があることを想像してみて使用MessageBox.Showし、対話プロセスをテストし、UIコンポーネントは、非常に困難になる。使用スタイレットではWindowManager、あなたは、そのインターフェイスでテストをモックすることができますIWindowManagerメッセージボックスをシミュレートするための行動。

  • 検証の後、我々は使用RequestClose(true)スタイレットは、ログインウィンドウを閉じる知らせるために、その結果を返しますtrue

次のようにこれまでのところ、当社のログインのViewModelが完了し、完全なコードは次のようになります。

using System;
using System.Windows;
using Stylet;

namespace StyletBookStore.Pages
{
    public class LoginViewModel : Screen
    {
        private readonly IWindowManager _windowManager;

        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; } = String.Empty;

        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; } = String.Empty;

        public LoginViewModel(IWindowManager windowManager)
        {
            _windowManager = windowManager;
        }

        /// <summary>
        /// 登录
        /// </summary>
        public void Login()
        {
            // 设计的非常安全的用户验证机制:)
            if (UserName != "waku" || Password != "123")
            {
                _windowManager.ShowMessageBox("用户名或密码不正确", "登录失败", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                return;
            }

            RequestClose(true);
        }

        /// <summary>
        /// 登录的防护属性
        /// </summary>
        public bool CanLogin => !string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password);
    }
}

この時点で、プロジェクト構造は次のようになります。

ログインウィンドウが表示されます

私たちは、ウィンドウに署名する準備ができているが、それはどのように表示されていますか?私たちのために準備ができてスタイレットを覚えているShellViewし、ShellViewModelあなたは?彼らはプログラムのメインウィンドウに責任がある、そこからスタート。

過去の経験によると、あなたは可能ShellView.xaml.csなコードを記述します。

    public ShellView()
    {
        InitializeComponent();
        Loaded += OnLoaded;
    }
    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        var window = new LoginView();
        window.ShowDialog();
    }

実際、これは我々が直視を操作するので、正しいアプローチは、ViewModelに中心に各ビューを表示するには、ViewModelにによって駆動され、違反MVVMです。

実際には、あなたがプロジェクトから直接すべての.xaml.csファイルを削除することができ、スタイレットはそれらを必要としません!

スタイレットを達成する方法を見てみましょう。

ShellViewModelクラスの増加OnViewLoaded書き換え方法を:

    protected override void OnViewLoaded()
    {
        var loginViewModel = _container.Get<LoginViewModel>();
        var result = _windowManager.ShowDialog(loginViewModel);
        if (result != true)
        {
            RequestClose();
        }
    }
  • OnViewLoadedは、基本クラスのメソッドであるScreenViewModelにバインドこのメソッドをコールしたときにロードされたビューで定義された方法。
  • 使用してContainer.Get取得するメソッドをLoginViewModelインスタンスすること。Containerそのを通じて、IoCコンテナにスタイレットですGet方法我々はIoCのクラス内のすべてのインスタンスに登録を取得することができます。
  • その後呼び出しWindowManager.ShowDialog、およびLoginViewModel.Styletになります、私たちに渡される引数としてインスタンスは、子ウィンドウを表示します。
  • ログインウィンドウが閉じられると、戻り値は、ウィンドウがここにログイン失敗に代わって、真実ではないかどうかを判断し、サインインすることが、我々はまだ呼び出すRequestClose操作をシャットダウンするが、シェルは、メインウィンドウであるため、アプリケーション全体も引き出されます後、ウィンドウが閉じられ、 。

使用するためにContainerWindowManager、我々はまた、コンストラクタで注入し、クラスのメンバ変数を受信するためにそれらを使用します:

    private readonly IContainer _container;
    private readonly IWindowManager _windowManager;

    public ShellViewModel(IContainer container, IWindowManager windowManager)
    {
        _container = container;
        _windowManager = windowManager;
    }

これがログインに注入されWindowManager、本質的に類似した、もはや説明しません。

インジェクションContainerと使用GetWIKIスタイレットであり、この点で。それはMVVMに論争の多くに違反するかどうかを、「サービスの位置決めモード」(サービスロケータパターン)として知られている方法を、議論して解決。しかし、私は個人的にそれを愛します。

完全なShellViewModelクラスコードは次のよう:

using Stylet;
using StyletIoC;

namespace StyletBookStore.Pages
{
    public class ShellViewModel : Screen
    {
        private readonly IContainer _container;
        private readonly IWindowManager _windowManager;

        public ShellViewModel(IContainer container, IWindowManager windowManager)
        {
            _container = container;
            _windowManager = windowManager;
        }

        protected override void OnViewLoaded()
        {
            var loginViewModel = _container.Get<LoginViewModel>();
            var result = _windowManager.ShowDialog(loginViewModel);
            if (result != true)
            {
                RequestClose();
            }
        }
    }
}

ラン

さて、私たちの最初の機能 - 「ログイン」アプリケーションをコンパイルし、実行し、完了しています:

我々は、次の4つの機能を確認する必要があります。

  • 「ユーザ名」や「パスワード」は空になると、(「ログイン」ボタンが無効になっている)にログオンすることが許可されていません。
  • ユーザ名「わくわく」を入力し、パスワードを入力し、「123」、ログインウィンドウが閉じて、メインウィンドウに戻ります。
  • それ以外の場合は、メッセージボックス「ユーザー名またはパスワードが正しくありません」。
  • ウィンドウ「X」ボタンの右上隅に、アプリケーション全体の終了をクリックしてログインします。

非常にいくつかのポイントの機能を確認する必要があるので、我々は手動で確認完全素早くすることができますが、いくつかの複雑なアプリケーションのために、手動の確認が非常に面倒ですが、また頻繁に反復プロセスでは、回帰テストが必要です。次ので、記事我々はViewModelにのためのユニットテストコードを書く方法を学びます。

Benpianはこれまでのところ、私はあなたがメッセージをたくさんすることができます願っています。ソースは、ホストされているgithubのを上。

コーディングハッピー〜

おすすめ

転載: www.cnblogs.com/waku/p/11692434.html