コンパイルされたコード(.NET 5)でグラフィック要素はどのように動的に作成されますか?

キリルザセピン

XAMLプロジェクトファイルは、XAMLコードのバイナリ表現(Binary Application Markup Language(BAML))にコンパイルされます。次に、BAMLコードは、アプリケーションの最終アセンブリ(exeファイルまたはdllファイル)にリソースとして埋め込まれます。XAMLに関するものです。ただし、アプリケーションの実行中にC#コード(!)で作成されたグラフィック要素についてはどうでしょうか。

アプリケーションが空のウィンドウであるとしましょう。

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<StackPanel x:Name="WindowStackPanel">
<Button Click="CreateButtonEvent" Content="I was created at compile time" />
</StackPanel>

</Window>

このXAMLは、実行可能リソースにコンパイルされます。

マウスイベントで、新しいボタンを追加します-これはグラフィック要素であり、アプリケーションのビルド中にBAMLにコンパイルされませんでした:

private void CreateButtonEvent(object sender, RoutedEventArgs e)
{
    WindowStackPanel.Children.Add(new Button() { Content = "Where was I created?" });
}

この点に関して、問題は、アプリケーションの実行中にC#コード(XAMLコードではない)でグラフィックアイテム(ボタン)を作成すると、技術的に何が起こるかということです。BAMLによって作成された共有リソースに書き込んでいますか、それともJITがすでに読み取っている独自の一時リソースを作成していますか?ありがとう

ピーター・ムーア

これは非常に興味深い質問であり、答えを理解することで、WPF(さらに言えばUWPまたはXamarin)が内部でどのように機能するかをより深く理解できると思います。

基本的に、XAMLには1つの単純な関数があります。それは、フレームワークにビジュアルツリーの構築方法を指示することです。そのため、XAMLで実行できることはすべてC#に変換できます。例外は1つも考えられません。あなたの例を見てください:

<StackPanel x:Name="WindowStackPanel">
     <Button Click="CreateButtonEvent" Content="I was created at compile time" />
</StackPanel>

これは次のように書くことができます:

var sp = new StackPanel() { Name = "WindowStackPanel" };
var button = new Button() { Content = "I was created at compile time" };
button.Click += CreateButtonEvent;
sp.Children.Add(button);

同じことをするのは2つの異なる方法です。

理論的には、XAMLコンパイラーはC#コードを出力するだけで、プロジェクトに組み込んでコンパイルすることができ、アプリケーションは現在とまったく同じように機能します。実際、たとえばを作成するUserControlと、コンパイラInitializeComponentコンストラクタで呼び出されたときに実行されるC#コードを実際に出力します。生成されたファイルは、objコンパイル後にプロジェクトディレクトリにあります。これx:Nameが、XAMLの 'dアイテムが、コードビハインドで参照できるプライベートクラスメンバーになる方法です。(これはあなたUserControlすべてpartialクラス)。同様に、Xamarin XAMLコンパイラには、XAMLをコンパイルし、IL(C#がコンパイルされるバイトコード)としてアセンブリに直接挿入するオプションがあります。これは、多かれ少なかれ、BAMLに対する彼らの答えです。

テンプレートでさえ、めったに使用されないC#を使用して作成できますFrameworkElementFactory(私はそれをお勧めしませんが、それは可能です!)本当に技術的になり、雑草にFrameworkElementFactory興味があるなら、実際には、BAMLが実行時にビジュアルツリーを構築するために処理されるときに使用されます。

したがって、直接の質問に戻ると、XAMLで何かを宣言しても、実際には作成されません。これは、作成した命令を、それは、実行時にオブジェクトを作成することを可能にするフレームワークに。したがって、すべてが実行時に作成されます。BAMLにコンパイルされたXAMLを介したもの、C#にコンパイルされたXAMLを介したもの、ストレートC#を介したものがあります。したがって、XAMLまたはC#コードを使用して、ボタンやその他の種類の視覚要素を追加しても、最終的には違いはありません。それはすべて、ユースケースに最適なものによって異なります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

.Net Coreは、文字列として渡されたC#コードを動的にコンパイルします

分類Dev

ルーティングパスのコントローラー部分は、.NET WebAPIでどのように構成されますか

分類Dev

ネイティブコードからの.NETメソッドコールバックはどのように実装されますか?

分類Dev

ハードコードされたパス:ASP.NET MVC Webサイトでリンクするにはどうすればよいですか?

分類Dev

vb.netコードビハインドで作成されたドロップダウンリストにハイパーリンクを追加するにはどうすればよいですか?

分類Dev

動的にコンパイルされたファイルは.NETのcsc.exeを使用しますか?

分類Dev

asp.netコアのcshtmlビューからコンパイルされたC#コードを取得するには?

分類Dev

Windows XPでNETコマンドによって作成されたパラレルポートにアクセスするにはどうすればよいですか?

分類Dev

Log4Netを備えたコンソールアプリはデバッグでコンパイルされますが、リリースモードではコンパイルされません

分類Dev

生成された.Netクラスまたは元のXSDの要素/プロパティ名に基づいてxmlファイルから値を文字列として抽出するにはどうすればよいですか?

分類Dev

コンパイル済みの.NET DLLファイルに保存されているフロート/ダブルリテラルはどうですか?

分類Dev

.net 4.6はインプレースアップグレードですか?では、なぜコントロールパネルにすべてのフレームワークバージョンが表示されるのでしょうか。

分類Dev

「dotnetビルド」中にコンパイラの警告が表示された場合、.netプロジェクトのjenkinsビルドに失敗できますか?

分類Dev

デバッグのためにnetcore 2.1+ / net 5でプリコンパイルされたビューを無効にする方法は?

分類Dev

Webから.netコアホスティングバンドルをインストールしようとすると、WiXバンドルが「ペイロードのハッシュの検証に失敗しました」と表示されます

分類Dev

asp.net C#の編集モードで「ファイルが選択されていません」の代わりにファイルアップロードコントロールですでに保存されているファイルを取得するにはどうすればよいですか?

分類Dev

VB.NETで動的に作成されたコントロールを管理するにはどうすればよいですか?

分類Dev

コンテンツを失うことなく、.NET5のファイルを.NET5 Rest APIにプログラムでアップロードするにはどうすればよいですか?

分類Dev

.NET 4.5でコンパイルされたプロファイラーを.NET3.5アプリケーションに接続できますか?

分類Dev

C#.net:プロジェクトにインストールされているNugetパッケージのソースコードを変更するにはどうすればよいですか?

分類Dev

コードが通常の.NETまたは.NETCoreのどちらで作成されているかを確認するにはどうすればよいですか?

分類Dev

asp.netコアのjqueryファイルアップロードから送信された追加のフォームデータにアクセスするにはどうすればよいですか?

分類Dev

.Net Coreコンソールアプリケーションの.exeファイルが配置されているディレクトリのパスを取得するにはどうすればよいですか?

分類Dev

VS Code は、net452 Framework を使用して .NET Core 用にコンパイルされたプロジェクトの PDB をロードしません。

分類Dev

.NETネイティブツールチェーンでコンパイルされたUWPアプリは、カスタムスタイルが原因で起動時にクラッシュします

分類Dev

ASP.NET Core-あるコントローラーで作成されたメソッドを別のコントローラーで再利用するにはどうすればよいですか?

分類Dev

ASP.NETコアインデントエラー:エンティティタイプ 'AppUserLogin'は単一のキープロパティで定義されていますが、2つの値が 'DbSet.Find'メソッドに渡されました

分類Dev

リモートマシンから提供された.netコア2サイトとコードを表示するにはどうすればよいですか?

分類Dev

ClangLLVMでコンパイルされたC ++コードのグラフィカルコードプロファイルレポートを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    .Net Coreは、文字列として渡されたC#コードを動的にコンパイルします

  2. 2

    ルーティングパスのコントローラー部分は、.NET WebAPIでどのように構成されますか

  3. 3

    ネイティブコードからの.NETメソッドコールバックはどのように実装されますか?

  4. 4

    ハードコードされたパス:ASP.NET MVC Webサイトでリンクするにはどうすればよいですか?

  5. 5

    vb.netコードビハインドで作成されたドロップダウンリストにハイパーリンクを追加するにはどうすればよいですか?

  6. 6

    動的にコンパイルされたファイルは.NETのcsc.exeを使用しますか?

  7. 7

    asp.netコアのcshtmlビューからコンパイルされたC#コードを取得するには?

  8. 8

    Windows XPでNETコマンドによって作成されたパラレルポートにアクセスするにはどうすればよいですか?

  9. 9

    Log4Netを備えたコンソールアプリはデバッグでコンパイルされますが、リリースモードではコンパイルされません

  10. 10

    生成された.Netクラスまたは元のXSDの要素/プロパティ名に基づいてxmlファイルから値を文字列として抽出するにはどうすればよいですか?

  11. 11

    コンパイル済みの.NET DLLファイルに保存されているフロート/ダブルリテラルはどうですか?

  12. 12

    .net 4.6はインプレースアップグレードですか?では、なぜコントロールパネルにすべてのフレームワークバージョンが表示されるのでしょうか。

  13. 13

    「dotnetビルド」中にコンパイラの警告が表示された場合、.netプロジェクトのjenkinsビルドに失敗できますか?

  14. 14

    デバッグのためにnetcore 2.1+ / net 5でプリコンパイルされたビューを無効にする方法は?

  15. 15

    Webから.netコアホスティングバンドルをインストールしようとすると、WiXバンドルが「ペイロードのハッシュの検証に失敗しました」と表示されます

  16. 16

    asp.net C#の編集モードで「ファイルが選択されていません」の代わりにファイルアップロードコントロールですでに保存されているファイルを取得するにはどうすればよいですか?

  17. 17

    VB.NETで動的に作成されたコントロールを管理するにはどうすればよいですか?

  18. 18

    コンテンツを失うことなく、.NET5のファイルを.NET5 Rest APIにプログラムでアップロードするにはどうすればよいですか?

  19. 19

    .NET 4.5でコンパイルされたプロファイラーを.NET3.5アプリケーションに接続できますか?

  20. 20

    C#.net:プロジェクトにインストールされているNugetパッケージのソースコードを変更するにはどうすればよいですか?

  21. 21

    コードが通常の.NETまたは.NETCoreのどちらで作成されているかを確認するにはどうすればよいですか?

  22. 22

    asp.netコアのjqueryファイルアップロードから送信された追加のフォームデータにアクセスするにはどうすればよいですか?

  23. 23

    .Net Coreコンソールアプリケーションの.exeファイルが配置されているディレクトリのパスを取得するにはどうすればよいですか?

  24. 24

    VS Code は、net452 Framework を使用して .NET Core 用にコンパイルされたプロジェクトの PDB をロードしません。

  25. 25

    .NETネイティブツールチェーンでコンパイルされたUWPアプリは、カスタムスタイルが原因で起動時にクラッシュします

  26. 26

    ASP.NET Core-あるコントローラーで作成されたメソッドを別のコントローラーで再利用するにはどうすればよいですか?

  27. 27

    ASP.NETコアインデントエラー:エンティティタイプ 'AppUserLogin'は単一のキープロパティで定義されていますが、2つの値が 'DbSet.Find'メソッドに渡されました

  28. 28

    リモートマシンから提供された.netコア2サイトとコードを表示するにはどうすればよいですか?

  29. 29

    ClangLLVMでコンパイルされたC ++コードのグラフィカルコードプロファイルレポートを作成するにはどうすればよいですか?

ホットタグ

アーカイブ