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]
コメントを追加