20210613のC#に関する記事は6件です。

Unity スクリプトでのオブジェクトの移動

0.0 はじめに オブジェクトを移動させる方法はいろいろとありますが、代表的な方法をまとめたいと思います。 Unityでオブジェクトを移動させるには、大きく2つの方法があります。 1つは、座標を変更して移動させる方法。もう1つは、オブジェクトに力を加えて移動させる方法です。 1.0 座標を変更させることによる移動 transformを使用して座標を直接変更します。オブジェクトを移動させるのに一番簡単で単純な方法です。ただし物理演算を無視した座標の変更は自然な動きに反しますので注意しましょう。 1.1 positionの変更による移動 直接座標を変えて移動するシンプルな方法です。 ?ポイント transform.position(transform.position.x または y, z)には直接値を代入出来ないので注意が必要です。 Vector3(Vector2)の変数を介してtransform.positionを変更します。 test1.cs Vector3 pos = transform.position; // 現在のポジションを代入 pos.x = 1.0f; // x座標変更 pos.y = 2.0f; // y座標変更 pos.z = -1.0f; // z座標変更 transform.position = pos; // 変更後の座標を代入 または下記のように変更します。 test2.cs transform.position = new Vector3(1.0f, 2.0f, -1.0f); 1.2 Translate関数を使った移動 transform.Translate(x, y, z)を使用してオブジェクトの現在の位置を基準に移動する方法です。 Translate()の引数で指定したベクトルx・y・z分だけオブジェクトの位置を移動させることができます。 test3.cs transform.Translate(1.0f, 2.0f, -1.0f); 1.3 Vector3.MoveTowards関数を使った移動 Vector3クラスにMoveTowards関数があります。MoveTowards関数は現在地から目的地まで一定速度で移動させてくれる関数です。引数には順番に “current” に現在地(Vector3)、”target” に目的地(Vector3)、”maxDistanceDelta” に1フレームの距離(一定速度)をfloatで指定します。 test4.cs Vector3 current = transform.position; Vector3 target = new Vector3(10, -5, 0); float step = 2.0f * Time.deltaTime; transform.position = Vector3.MoveTowards(current, target, step); 1.4 Vector3.Lerp関数を使った移動 Vector3クラスにはLerp関数もあり、これを使用してオブジェクトを移動させることができます。 Lerp(a, b, t)関数の引数は a : 始まりの位置, b : 終わりの位置, t : aからの現在の位置の割合です。 ?ポイント tが0の時はaの地点、tが1の時はbの地点です。 test5.cs Vector3 start = transform.position; Vector3 target = new Vector3(10, -5, 0); float timer = 0; timer += Time.deltaTime; transform.position = Vector3.Lerp(start, target, timer); // timerの変化分だけ移動させる(1秒で目的地) 2.0 力を加えることによる移動 オブジェクトにRigidbody(リジッドボディ)コンポーネントを追加することで、物理演算で移動させることができます。 InspectorウインドウでAdd Componentボタンを押して検索窓でRigidbodyを検索して追加しましょう。※2Dの場合はRigidbody 2Dを選びます。 ?ポイント RigidbodyにはUse Gravity、Rigidbody2DにはGravity Scaleのパラメータがあり、重力の影響を調節できます。 2.1 速度を変更するVelocity関数を使う 一定の速度でオブジェクトを移動させたり、移動する速度を制限することができます。 test6.cs Rigidbody rb = GetComponent<Rigidbody>(); rb.velocity = Vector3.right * 2f; // 速さを直接入れる 2.2 力を加え加速度を変更するAddForce関数を使う オブジェクトに力を加えて物理演算を元に移動させることができます。現実世界と同じようにオブジェクトを自然な動きで移動させることができます。衝突のふるまいなど物理現象を使用している場合はこのAddForce関数を使いましょう。 ?ポイント 加える力が小さいとオブジェクトがうまく動かない場合があります。この場合はオブジェクトの質量を軽くするか、与える力を大きくすることで、オブジェクトを移動させることができます。 test7.cs Rigidbody rb = GetComponent<Rigidbody>(); rb.AddForce(1.0f, 2.0f, -1.0f); // 加える力のベクトルをVectorで入れる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

親GameObjectの影響を排除したscale算出方法

階層構造になっているGameObjectで、親のscaleを変更したときに子のサイズは変わってほしくないことがありました。 こういう場合のlocalScaleの算出方法について、検討した案を残しておきます。 案1: まずは正攻法 親の影響を打ち消すスケール算出(正攻法版) var localScale = this.transform.localScale; var lossyScale = this.transform.lossyScale; this.transform.localScale = new Vector3( localScale.x / lossyScale.x, localScale.y / lossyScale.y, localScale.z / lossyScale.z); すぐに思い付くし、理解しやすいし、良いと思います。 …でも長いしなんだか冗長でもやもやする。 x, y, zを間違えそうでちょっと怖いのもある。 もう少しすっきり書ける方法は無いのだろうか…? 案2: インデクサ利用 Vector3にはインデクサが用意されているので、これを使ってみます。 親の影響を打ち消すスケール算出(インデクサ利用版) var localScale = this.transform.localScale; var lossyScale = this.transform.lossyScale; var scaleUnaffectedByParents = Vector3.zero; Enumerable.Range(0, 3).ToList().ForEach(i => scaleUnaffectedByParents[i] = localScale[i] / lossyScale[i]); this.transform.localScale = scaleUnaffectedByParents; x, y, zを間違える可能性が無いのが良いですね。 割り算の記述も一箇所になってそれなりにすっきりはしましたが…以下の部分があと一歩足りないように感じてしまいます。 マジックナンバーが登場する。 Vector3のプロパティにインデクサでアクセスするというのがいまいちしっくり来ない。 案3: Transformのメソッド活用 こんなやり方で算出することも可能です。 親の影響を打ち消すスケール算出(Transformのメソッド活用版) // localScaleを表すベクトルをワールドの向きに変換 var worldDirectedLocalScale = this.transform.TransformDirection(this.transform.localScale); // ワールド上で上記ベクトルを示す場合のローカル上での表現方法を算出 // これがlocalScale設定値の大きさをワールド上で実現するために必要なlocalScaleとなる var scaleUnaffectedByParents = this.transform.InverseTransformVector(worldDirectedLocalScale); this.transform.localScale = scaleUnaffectedByParents; 無駄に複雑になってしまいましたが、これってUnityエキスパートの方ならすぐに理解できるものなのでしょうか? 解説 絵を描いてみました。 バブルの中に入ったUnityちゃんはscale1倍。そしてバブルがx, y共にscale2倍だったとします。 (表現しやすいので2Dで考えます) 親のscaleの影響を排除したいということは、「local scale = world scale」となってほしいのです。 つまり、今のlocalScaleの値がworldScaleとなるような値を、localScaleに設定できれば良いのです。 設定したいlocalScale → ワールドへの変換 → (x, y) = (1, 1) となってほしい。ということは、 (x, y) = (1, 1) → ワールドからローカルへの変換 → 設定したいlocalScale しかしこれだけだと、ローカルスペースとワールドスペースの軸の向きが異なる場合に上手くいきません。 ということで、向きを合わせる必要があります。 結果的に以下の手順で算出することになります。番号を画像内の数字と一致させています。 UnityちゃんのlocalScaleを取得すると(x, y) = (1, 1)が取得できる。 これをワールドスペース上での向きに変換する。 45度左に傾いているUnityちゃんの中での(x, y) = (1, 1)の方向は、ワールドスペース上では(x, y) = (0, 1.4)となる。 このベクトルがワールドスペースにあるときにローカルスペースではどう表記するのか?がlocalScalに設定すべき値となるので、ベクトルをローカルスペースに変換する。 これでほしい値は算出できるのですが…より理解しやすい書き方があるのにこれだけ解説が必要となる案は悪手だよね、ということで没になりました。 ベクトルや、ワールドスペースとローカルスペースについての理解を深めるためのクイズとしては機能するかもしれません。 ということで、案1か2の書き方にするしか無さそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows FormアプリをMSIXでパッケージ化・配布する

MSIXについて ClickOnceに変わる新しいアプリケーション配布の仕組みとして、MSIXがあります。 既存の.NET Frameworkで作成したアプリケーションでも、Windows アプリケーション パッケージ プロジェクトをソリューションに追加するだけで、容易にMSIXでパッケージ化することができます。 Docsに詳細な記載はありますが、実際の手順について記載します。 https://docs.microsoft.com/ja-jp/windows/msix/desktop/desktop-to-uwp-packaging-dot-net MSIXの更新の仕組み MSIXの更新の仕組みは、ClickOnceのように「毎回起動時に更新」ではありません。 AppX Deployment Service (AppXSVC)という、Microsoft Store アプリケーションを展開するためのサービスが不定期にチェックをかけてバックグラウンドで更新するため、更新の処理が一定以上進むまでは更新前のバージョンでアプリケーションが起動します。 従って、更新版をリリースしたのに、クライアントによっては2回くらい再起動しないと更新が反映されない事があります。 ClickOnceのようにアプリ起動時に「必ず」更新確認するやり方は別記事で紹介します。 MSIXのパッケージ化の手順 では、実際にMSIXでパッケージ化する手順について記載します。 プロジェクトの準備 通常のWindowsフォームアプリケーションやコンソールアプリケーションのソリューションに、「Windows アプリケーション パッケージ プロジェクト」を追加します。 追加された「Windows アプリケーション パッケージ プロジェクト」(以後、「WinAppPackagingプロジェクト」)のアプリケーションを右クリックし、「参照の追加」をクリックします。 既存のプロジェクトの一覧が表示されるので、パッケージングするプロジェクトを選択して【OK】を押下します。 WinAppPackagingプロジェクトのプロパティを表示すると、ターゲットとなるWindows10のバージョンを指定できます。特に変える必要も無いかと思います。 次に、Package.appxmanifestをダブルクリックするとアプリ名等の設定ができます。 「表示名」がスタートメニューやアプリの一覧に表示される名前です。 「パッケージ表示名」がインストール画面に表示される名前です。 パッケージ化 次に発行です。WinAppPackagingプロジェクトを右クリックし、「公開」→「アプリパッケージの作成」を選択します。 配布方法:そのままで【次へ】を押下します。 署名方法の選択:コードサイニング証明書を持っていればいずれかから選択、テスト的なものであれば【作成】を押してオレオレ証明書を作成します。 証明書の準備ができたら、【次へ】を押下します。 出力場所を確認し、【次へ】を押下します。 インストーラを配置するURLを入力し、【作成】を押下します。 以下の画面が表示されれば完了です。【閉じる】を押下し、「出力場所」に作成されたファイルを、「インストーラーの場所」に公開すれば他のPCからインストール可能な状態となります。 クライアントへのインストール 「インストーラーの場所」のURL(index.html)をブラウザで開き、【アプリを取得する】をクリックします。 または、「ファイル名を指定して実行」で以下のようにappinstallerを実行すると直接インストーラを起動することができます。 ms-appinstaller:?source=https://**************/WinAppPackaging.appinstaller 「アプリインストーラーを開きますか?」が表示されたら、【アプリインストーラーを開く】をクリックします。 「○○をインストールしますか?」で【インストール】をクリックします。 インストールが完了すると、アプリが起動します。 更新時の動き クライアントにインストール後、新しいバージョンを「インストーラーの場所」配置し、しばらくすると自動的に更新が走ります。 最初に記載したように、バックグラウンドで更新されるまでは古い(インストールされている)バージョンが起動します。 大体、クライアントが2回くらい再起動されないと更新されないように感じます。 更新が走った時、スタートメニューの項目の下にプログレスバーが表示されるので「更新された」というのがわかります。 また、イベントビューワーで更新のログを確認する事も出来ます。 アプリケーションとサービスログ → Microsoft → Windows → AppXDeployment-Server
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[WPF/xaml] ListViewをグループ表示/ソート表示する(C#コードで書く)

やりたいこと Grid表示のListViewの中身を、ある列の内容でグループ表示したい。下記のようなイメージ。 やり方 <CollectionViewSource>を使う。 前回の記事で、xamlにCollectionViewSourceを書いてみたので、今回はコードに書くやり方を試してみる。 (今回はついでにソートも実施) MainWindow.xaml <Window x:Class="WpfApp48.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:WpfApp48" mc:Ignorable="d" Title="MainWindow" Height="300" Width="200"> <Window.Resources> <!-- グループのヘッダのスタイルを作成 --> <DataTemplate x:Key="GroupHeaderTemplate"> <Border Background="#FFCDF2CD"> <TextBlock Text="{Binding Name}" FontWeight="Bold"/> </Border> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="10*"/> <RowDefinition Height="1*"/> </Grid.RowDefinitions> <!-- ListViewのItemsSourceをCollectionViewSourceのViewにするのがポイント --> <ListView Name="MainList" ItemsSource="{Binding UICollectionViewSource.View}"> <!-- グループのヘッダのスタイルを指定(これを指定しないと、グループのヘッダはナシになる) --> <ListView.GroupStyle> <GroupStyle HeaderTemplate="{StaticResource GroupHeaderTemplate}" /> </ListView.GroupStyle> <ListView.View> <GridView> <GridViewColumn Header="機体" DisplayMemberBinding="{Binding MachineName}" Width="80" /> <GridViewColumn Header="パイロット" DisplayMemberBinding="{Binding PilotName}" Width="80" /> </GridView> </ListView.View> </ListView> <Button Grid.Row="1" Content="ボタン" Click="Button_Click"/> </Grid> </Window> MainWindow.xaml.cs using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace WpfApp48 { public partial class MainWindow : Window, INotifyPropertyChanged { #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName)=> this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); #endregion // ガンダム情報を格納 public ObservableCollection<MyData> DataList { get; set; } = new ObservableCollection<MyData>(); // ソート/グルーピングに使うCollectionViewSource CollectionViewSource _UICollectionViewSource; public CollectionViewSource UICollectionViewSource { get { return _UICollectionViewSource; } set { _UICollectionViewSource = value; } } public MainWindow() { InitializeComponent(); this.DataContext = this; // CollectionViewSourceのソースにDataListを設定 UICollectionViewSource = new CollectionViewSource(); UICollectionViewSource.Source = DataList; } // ボタンをおしたらデータの中身を追加 private void Button_Click(object sender, RoutedEventArgs e) { DataList.Add(new MyData() { MachineName = "ガンダム", PilotName = "アムロ" }); DataList.Add(new MyData() { MachineName = "シャアザク", PilotName = "シャア" }); DataList.Add(new MyData() { MachineName = "グフ", PilotName = "誰やったっけ?" }); DataList.Add(new MyData() { MachineName = "Zガンダム", PilotName = "カミーユ" }); DataList.Add(new MyData() { MachineName = "ガンダムmk-Ⅱ", PilotName = "アムロ" }); DataList.Add(new MyData() { MachineName = "ジ・オ", PilotName = "シロッコ" }); DataList.Add(new MyData() { MachineName = "百式", PilotName = "シャア" }); DataList.Add(new MyData() { MachineName = "ZZガンダム", PilotName = "ジュドー" }); DataList.Add(new MyData() { MachineName = "νガンダム", PilotName = "アムロ" }); //ソートの指定 SortDescription sortDescription; UICollectionViewSource.SortDescriptions.Clear(); sortDescription = new SortDescription { PropertyName = "MachineName", Direction = ListSortDirection.Ascending }; UICollectionViewSource.SortDescriptions.Add(sortDescription); sortDescription = new SortDescription { PropertyName = "PilotName", Direction = ListSortDirection.Ascending }; UICollectionViewSource.SortDescriptions.Add(sortDescription); //グループの指定 PropertyGroupDescription groupDescription; UICollectionViewSource.GroupDescriptions.Clear(); groupDescription = new MyDataGroupDescription { // なにでグループを作るか決める PropertyName = "PilotName" }; UICollectionViewSource.GroupDescriptions.Add(groupDescription); UICollectionViewSource.View.Refresh(); } } // ガンダム情報クラス public class MyData { public string MachineName { get; set; } public string PilotName { get; set; } } class MyDataGroupDescription : PropertyGroupDescription { // データの中身からグループのヘッダに出すものを決める public override object GroupNameFromItem(object item, int level, System.Globalization.CultureInfo culture) { var uiobject = (MyData)item; return uiobject.PilotName; } } } 参考 こちらのやり方をかなり参考にさせて頂いています。ありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[WPF/xaml] ListViewをグループ表示する

やりたいこと Grid表示のListViewの中身を、ある列の内容でグループ表示したい。下記のようなイメージ。 やり方 <CollectionViewSource>を使う。 MainWindow.xaml <Window x:Class="WpfApp48.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:WpfApp48" mc:Ignorable="d" Title="MainWindow" Height="300" Width="200"> <Window.Resources> <!-- 何のくくりでグループを作るか指定 --> <CollectionViewSource x:Key="cvSource" Source="{Binding DataList}" > <CollectionViewSource.GroupDescriptions> <PropertyGroupDescription PropertyName="PilotName"/> </CollectionViewSource.GroupDescriptions> </CollectionViewSource> <!-- グループのヘッダのスタイルを作成 --> <DataTemplate x:Key="GroupHeaderTemplate"> <Border Background="#FFCDF2CD"> <TextBlock Text="{Binding Name}" FontWeight="Bold"/> </Border> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="10*"/> <RowDefinition Height="1*"/> </Grid.RowDefinitions> <ListView Name="MainList" ItemsSource="{Binding Source={StaticResource cvSource}}"> <!-- グループのヘッダのスタイルを指定 --> <ListView.GroupStyle> <GroupStyle HeaderTemplate="{StaticResource GroupHeaderTemplate}" /> </ListView.GroupStyle> <ListView.View> <GridView> <GridViewColumn Header="機体" DisplayMemberBinding="{Binding MachineName}" Width="80" /> <GridViewColumn Header="パイロット" DisplayMemberBinding="{Binding PilotName}" Width="80" /> </GridView> </ListView.View> </ListView> <Button Grid.Row="1" Content="ボタン" Click="Button_Click"/> </Grid> </Window> MainWindow.xaml.cs using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace WpfApp48 { public partial class MainWindow : Window, INotifyPropertyChanged { #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName)=> this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); #endregion // ガンダム情報を格納 public ObservableCollection<MyData> DataList { get; set; } = new ObservableCollection<MyData>(); public MainWindow() { InitializeComponent(); this.DataContext = this; } // ボタンをおしたらデータの中身を追加 private void Button_Click(object sender, RoutedEventArgs e) { DataList.Add(new MyData() { MachineName = "ガンダム", PilotName = "アムロ" }); DataList.Add(new MyData() { MachineName = "シャアザク", PilotName = "シャア" }); DataList.Add(new MyData() { MachineName = "グフ", PilotName = "誰やったっけ?" }); DataList.Add(new MyData() { MachineName = "Zガンダム", PilotName = "カミーユ" }); DataList.Add(new MyData() { MachineName = "ガンダムmk-Ⅱ", PilotName = "アムロ" }); DataList.Add(new MyData() { MachineName = "ジ・オ", PilotName = "シロッコ" }); DataList.Add(new MyData() { MachineName = "百式", PilotName = "シャア" }); DataList.Add(new MyData() { MachineName = "ZZガンダム", PilotName = "ジュドー" }); DataList.Add(new MyData() { MachineName = "νガンダム", PilotName = "アムロ" }); } } /// <summary> /// ガンダム情報クラス /// </summary> public class MyData { public string MachineName { get; set; } public string PilotName { get; set; } } } 結果、最初に張り付けた画面のようになる。 参考 コードでやるやり方 xamlでやるやり方等
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[WPF/xaml] ListViewをグループ表示する(xamlで書く)

やりたいこと Grid表示のListViewの中身を、ある列の内容でグループ表示したい。下記のようなイメージ。 やり方 <CollectionViewSource>を使う。 MainWindow.xaml <Window x:Class="WpfApp48.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:WpfApp48" mc:Ignorable="d" Title="MainWindow" Height="300" Width="200"> <Window.Resources> <!-- 何のくくりでグループを作るか指定 --> <CollectionViewSource x:Key="cvSource" Source="{Binding DataList}" > <CollectionViewSource.GroupDescriptions> <PropertyGroupDescription PropertyName="PilotName"/> </CollectionViewSource.GroupDescriptions> </CollectionViewSource> <!-- グループのヘッダのスタイルを作成 --> <DataTemplate x:Key="GroupHeaderTemplate"> <Border Background="#FFCDF2CD"> <TextBlock Text="{Binding Name}" FontWeight="Bold"/> </Border> </DataTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="10*"/> <RowDefinition Height="1*"/> </Grid.RowDefinitions> <ListView Name="MainList" ItemsSource="{Binding Source={StaticResource cvSource}}"> <!-- グループのヘッダのスタイルを指定 --> <ListView.GroupStyle> <GroupStyle HeaderTemplate="{StaticResource GroupHeaderTemplate}" /> </ListView.GroupStyle> <ListView.View> <GridView> <GridViewColumn Header="機体" DisplayMemberBinding="{Binding MachineName}" Width="80" /> <GridViewColumn Header="パイロット" DisplayMemberBinding="{Binding PilotName}" Width="80" /> </GridView> </ListView.View> </ListView> <Button Grid.Row="1" Content="ボタン" Click="Button_Click"/> </Grid> </Window> MainWindow.xaml.cs using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace WpfApp48 { public partial class MainWindow : Window, INotifyPropertyChanged { #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName)=> this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); #endregion // ガンダム情報を格納 public ObservableCollection<MyData> DataList { get; set; } = new ObservableCollection<MyData>(); public MainWindow() { InitializeComponent(); this.DataContext = this; } // ボタンをおしたらデータの中身を追加 private void Button_Click(object sender, RoutedEventArgs e) { DataList.Add(new MyData() { MachineName = "ガンダム", PilotName = "アムロ" }); DataList.Add(new MyData() { MachineName = "シャアザク", PilotName = "シャア" }); DataList.Add(new MyData() { MachineName = "グフ", PilotName = "誰やったっけ?" }); DataList.Add(new MyData() { MachineName = "Zガンダム", PilotName = "カミーユ" }); DataList.Add(new MyData() { MachineName = "ガンダムmk-Ⅱ", PilotName = "アムロ" }); DataList.Add(new MyData() { MachineName = "ジ・オ", PilotName = "シロッコ" }); DataList.Add(new MyData() { MachineName = "百式", PilotName = "シャア" }); DataList.Add(new MyData() { MachineName = "ZZガンダム", PilotName = "ジュドー" }); DataList.Add(new MyData() { MachineName = "νガンダム", PilotName = "アムロ" }); } } /// <summary> /// ガンダム情報クラス /// </summary> public class MyData { public string MachineName { get; set; } public string PilotName { get; set; } } } 結果、最初に張り付けた画面のようになる。 参考 コードでやるやり方 xamlでやるやり方等
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む