rksoftware

Visual Studio とか C# とかが好きです

秋葉原 C# もくもく会 #44 勉強会を開催しました

■ C# もくもく会

C# もくもく会 #44 を開催しました。

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20180629012255j:plain

毎度のことではございますが、
入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2018/07/05 に開催予定です。

C# に関心のある方、是非遊びに来てください。

Xamarin.Forms.WPF アプリを ClickOnce でインストールする

以前の記事で Xamarin.Forms.WPF でデスクトップアプリを作成しました。

このデスクトップアプリを配布するためにインストーラーを作成してみましょう。
今回は、Visual Studio 標準で作成でき、エンタープライズ分野で使われることもある ClickOnce のインストーラーを作成します。

■ Xamarin.Forms.WPF は普通の WPF アプリ

Xamarin.Forms.WPF は出来上がるアプリの形式としては、普通の WPF アプリです。
つまり、ビルドして生成されるバイナリは .exe ファイルです。
ということは普通のインストーラーを作成し、インストールすることができるということです。アプリケーションの配布についてはいろいろな戦略があり、インストーラーがすべてではありません。しかしインストーラーが作れないなどとなると制約となってしまいます。

■ ClickOnce の発行

  • まずは通常の手順で Xamarin.Forms.WPF アプリを作成します。

  • プロジェクトのプロパティを開きます。
  • [発行] タブを開きます。
  • [今すぐ発行] ボタンをクリックします。

これだけでインストーラーが出来上がります。

■ インストール

そつなくインストーラーができたので早速インストールしてみます。

システムの更新が必要 このアプリケーションをインストールまたは実行できません。このアプリケーションでは、まずグローバル アセンブリ キャッシュ (GAC) にアセンブリ netfx.force.conflicts バージョン 0.0.0.0 を インストールする必要があります。

というエラーが発生しインストールに失敗します。

Bing ってみると、ASP.NET の情報で「obj や bin を消してリビルド」が何件か見られます。しかし試してみても状況に変化はありませんでした。

■ グローバル アセンブリ キャッシュ への登録

素直に グローバル アセンブリ キャッシュ へ登録してみます。

を参考に作業します。

コマンド

gacutil -i netfx.force.conflicts.dll

次のメッセージが表示されれば成功です。

アセンブリが正しくキャッシュに追加されました

・参考: Assembly の場所
私の環境では、netfx.force.conflicts.dll が次のフォルダにいました。(一番バージョンの低いものを選択しました)

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib

■ もう一度インストール

再度インストーラーを実行すると、今度はインストールに成功しました。

とても地味なことですが、インストーラーの作成が行えました。
インストーラーも使えるということで、Xamarin.Forms.WPF が普通にデスクトップアプリ開発に使える期待がまた一つ高まりました。

Xamarin.Forms.WPF でアプリケーション設定ファイルに設定をする

以前の記事で Xamarin.Forms.WPF でデスクトップアプリを作成しました。

このデスクトップアプリで設定ファイルによる設定機能を追加してみます。

■ 普通の WPF アプリ

Xamarin.Forms.WPF は出来上がるアプリの形式としては、普通の WPF アプリです。
つまり、ビルドして生成されるバイナリは .exe ファイルです。

※bin フォルダ内のバイナリ(抜粋)
f:id:rksoftware:20180627031234j:plain

普通の .exe ということは普通に .exe.config ファイルもいます。
bin フォルダを確認してみると実際に .exe.config が存在することが確認できます。

■ 設定

というわけで、App.config ファイルに設定を追加してみます。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  ・・・中略・・・

  <applicationSettings>
    <XFWPF.WPF.Properties.Settings>
      <setting name="Setting_A" serializeAs="String">
        <value>設定値</value>
      </setting>
    </XFWPF.WPF.Properties.Settings>
  </applicationSettings>
</configuration>

■ 設定の読み込み

本来であれば DependencySearvice などを利用したプラットフォーム機能の呼び出しとして実装するところです。
今回は設定ファイルの確認ということで、手短に直接呼び出してみます。
MainWindow.xaml.cs ファイルに

System.Windows.MessageBox.Show(XFWPF.WPF.Properties.Settings.Default.Setting_A);

と、設定ファイルを読んでメッセージボックスを表示するコードを追加します。
追加後の MainWindow.xaml.cs は次の言うになります。

namespace XFWPF.WPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Xamarin.Forms.Platform.WPF.FormsApplicationPage
    {
        public MainWindow()
        {
            InitializeComponent();

            System.Windows.MessageBox.Show(XFWPF.WPF.Properties.Settings.Default.Setting_A);

            Xamarin.Forms.Forms.Init();
            LoadApplication(new XFWPF.App());
        }
    }
}

■ 実行

実行してみます。
f:id:rksoftware:20180627031249j:plain

とても地味な絵面ですが、設定ファイルの内容が読めています。
設定ファイルも使えるということで、Xamarin.Forms.WPF が普通にデスクトップアプリ開発に使える期待がまた一つ高まりました。

秋葉原 C# もくもく会 #43 勉強会を開催しました

■ C# もくもく会

C# もくもく会 #43 を開催しました。

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20180621213134j:plain

いつも入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2018/06/28 に開催予定です。

C# に関心のある方、是非遊びに来てください。

Xamarin.Forms.WPF の画面上の青い領域を消す

前回 Xamarin.Forms.WPF でデスクトップアプリを作りました。

WPF のアプリを作ることができましたが、画面上方に広い青い領域があることが気になります。
f:id:rksoftware:20180621211536j:plain
Windows Phone アプリ標準のテンプレートでアプリ名やページ名を表示する広い領域が画面上部にあったのを何となく思い出します。

■ 表示されるもの

Xamarin.Forms.WPF アプリのこの上部の領域ですが、ページに Title 属性を設定すると、設定したタイトルが表示されます。
f:id:rksoftware:20180621211636j:plain

なるほど、そういう領域ね完璧に理解したわ。
などと思いながら、ページ遷移を実装して 2 ページ目に遷移すると。。。

f:id:rksoftware:20180621211731j:plain
!?
1 ページ目だけの特殊機能何でしょうか?

■ NavigationPage

ページ遷移と言えば Xamarin.Forms には NavigationPage というものがあります。こちらも試してみましょう。
NavigationPage を使うには共有コードプロジェクトの App.xaml.cs を編集します。

  • MainPage = new MainPage();MainPage = new NavigationPage(new MainPage()); と書き換えます。

変更前

using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation (XamlCompilationOptions.Compile)]
namespace XFWPF
{
    public partial class App : Application
    {
        public App ()
        {
            InitializeComponent();

            MainPage = new MainPage();
        }

変更後

using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation (XamlCompilationOptions.Compile)]
namespace XFWPF
{
    public partial class App : Application
    {
        public App ()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new MainPage());
        }

表示
f:id:rksoftware:20180621211848j:plain
!?
どうやら話題の領域はナビゲーションバーだったようです。
ナビゲーションバーなら消すのは簡単です。

■ ナビゲーションバーを消す方法

ナビゲーションバーを消すにはページクラスのコンストラクタに NavigationPage.SetHasNavigationBar(this, false); を書き足します。

変更前

using System;
using Xamarin.Forms;

namespace XFWPF
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

変更後

using System;
using Xamarin.Forms;

namespace XFWPF
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

                        NavigationPage.SetHasNavigationBar(this, false);
        }

表示
f:id:rksoftware:20180621211959j:plain

これなら画面に入力項目を30個、40個と並べたアプリが大好きなジャパニーズエンタープライズアプリケーション開発者も安心ですね。

Xamarin.Forms.WPF でデスクトップアプリを作る

Xamarin.Forms で WPF アプリが作れるようになっています。
今回は、とりあえずデバッグでアプリとして起動するまでの手順を紹介します。まだ、課題もありそうですが、普通に動くので皆さん是非試してみてください。

環境は Windows + Visual Studio です。
※WPF は Mac で動きませんし。

■ 普通に Xamarin.Forms プロジェクトを作る

まずは普通に Xamarin.Forms ソリューションを新規作成します。
この際、今回は Code Sharing Strategy.NET Standard を選択しておきます。
※ソリューション名は「XFWPF」と付けました。

■ WPF プロジェクトを追加

ソリューションに WPF プロジェクトを追加します。
プロジェクト名は「XFWPF.WPF」と付けました。

■ プロジェクト参照を追加

追加した WPF プロジェクトに参照を追加します。
XFWPF.WPF プロジェクトの参照に共有コードのプロジェクトを追加します。
共有コードのプロジェクトは今回は「XFXPF」という名前になっています。
f:id:rksoftware:20180621015702j:plain

■ NuGet パッケージの追加

WPF プロジェクトに NuGet パッケージを追加します。
追加するパッケージ

  • Xamarin.Forms.Platform.WPF
  • Xamarin.Forms

※prerelease を含むチェックは OFF で OK です。

■ MainWindow.xaml.cs の編集

  • base クラスを Xamarin.Forms.Platform.WPF.FormsApplicationPage に変更
  • コンストラクタの InitializeComponent(); の後に Xamarin.Forms.Forms.Init();LoadApplication(new XFWPF.App()); を追加

変更前

using System.Windows;

namespace XFWPF.WPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

 
変更後

namespace XFWPF.WPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Xamarin.Forms.Platform.WPF.FormsApplicationPage
    {
        public MainWindow()
        {
            InitializeComponent();

            Xamarin.Forms.Forms.Init();
            LoadApplication(new XFWPF.App());
        }
    }
}

■ MainWindow.xaml の編集

  • トップレベルの要素(Window)に属性 xmlns:xf="clr-namespace:Xamarin.Forms.Platform.WPF;assembly=Xamarin.Forms.Platform.WPF" を追加
  • トップレベルの要素を FormsApplicationPage に変更

変更前

<Window x:Class="XFWPF.WPF.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:XFWPF.WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
    </Grid>
</Window>

 
変更後

<xf:FormsApplicationPage x:Class="XFWPF.WPF.MainWindow"
        xmlns:xf="clr-namespace:Xamarin.Forms.Platform.WPF;assembly=Xamarin.Forms.Platform.WPF"
        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:XFWPF.WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
    </Grid>
</xf:FormsApplicationPage>

■ スタートアッププロジェクトの変更

  • WPF プロジェクト「XFWPF.WPF」をスタートアッププロジェクトにします

■ 実行

  • 実行します

f:id:rksoftware:20180621015728j:plain

Welcome to Xamarin.Forms! ... すこし文字が読みずらいですね。

■ MainPage.xaml の編集

共有コードプロジェクトの MainPage.xaml を編集します。

  • Label 要素の HorizontalOptionsFill に変更
  • Label 要素の属性に HorizontalTextAlignment="Center" を追加

変更前

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XFWPF"
             x:Class="XFWPF.MainPage">

    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Welcome to Xamarin.Forms!" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
    </StackLayout>

</ContentPage>

 
変更後

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XFWPF"
             x:Class="XFWPF.MainPage">

    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Welcome to Xamarin.Forms!" 
           HorizontalOptions="Fill"
           HorizontalTextAlignment="Center"
           VerticalOptions="CenterAndExpand" />
    </StackLayout>

</ContentPage>

■ 実行

f:id:rksoftware:20180621015751j:plain
改めて

Welcome to Xamarin.Forms!

これでデスクトップアプリ開発も完璧です!

城東.NET #21 勉強会を開催しました。

■ 城東.NET

城東.NET #21 を開催しました。

f:id:rksoftware:20180620211905j:plain

城東.NET は東京の最近は秋葉原で毎月第3水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。

来月はちょっと1週ずらして第4水曜日に開催予定です。

私は Xamarin でクラシックデスクトップアプリ(WPF)が作れるらしいので試してみた というタイトルで話をしました。

少しずつですがいろいろ試していっています。
今回は、WPF アプリとしてのインストールなども試してみました。

■ 次回予定

来月は 07月25日(水)に開催の予定です。

.NET に関心のある方、是非遊びに来てください。