0

初心者の質問を許してください-私のバックグラウンドはUnixであり、WPFに関しては非常に緑色です...

//Context// Visual Studio または Blend を使用して、単一ページの WPF ベースの UI を設計する必要があります。

さらに、これをマイクロソフトが生成したソリューションの外部に移植できるようにする必要があります...これは、「NinjaTrader」と呼ばれるソフトウェアによって公開される別の c# 環境内でビジネス ロジックを定義できる必要があるためです (使用する可能性がある人向け)。それ)。

私は.NET 3.5に制限されています

//追加情報// 現在、できるだけ早く概念実証に取り組もうとしています。winforms を使用して UI を正常に実装しました。VS 内でフォームを設計し、自動生成されたデザイナー コードを NinjaTrader 内の独自の抽象クラス定義 (「myForm」など) にコピーするだけです。次に、myForm を「標準」の NinjaTrader.Indicator クラス (myForm2 クラスをインスタンス化できるようにするために必要) 内の新しいクラス定義に継承し、外部クラスを myForm2 のコンストラクターに渡し、メソッドをオーバーライドする必要があります。ビジネス ロジックが必要です。NinjaTrader.Indicator クラスの「OnStartUp」で UI を表示し、必要な動作を実装できます。

//私の問題// これまでのところ、WPF はより困難であることが証明されています。「WPFWindow.xaml.cs」からクラス定義をコピーしようとしました。また、「WPFWindow.g.cs」から必要なものを単一の .cs ファイルにコピーしようとしました (NinjaTrader 内の制限により、これには単一のファイルを使用する必要があります)。 )、そして別の NinjaTrader.Indicator クラスからこのクラスをインスタンス化します。

すべてが同じ名前空間にありますが、相対 Uri に関しては繰り返し困惑し、何をしても次のメッセージが表示されるようです。

リソース 'wpfwindow/wpfwindow.xaml' が見つかりません

今-私は、別のアプリケーション内から実行すると、相対Uriが同じではないことを認識しており、WPFWindow.xamlファイルを新しいフォルダー(現在の作業ディレクトリと思われるフォルダー内)にコピーしようとしました。スペースなし) と相対の計算:

    string cpath = Directory.GetCurrentDirectory();
    string installPath = @"C:\Program Files (x86)\NinjaTrader 7\bin64\WPFWindow\WPFWindow.xaml";
    Uri cwUri = new Uri(@cpath);
    Uri instUri = new Uri(@installPath);
    string relPath = cwUri.MakeRelativeUri(instUri).ToString();

    System.Uri resourceLocater = new System.Uri(relPath, System.UriKind.Relative);

    System.Windows.Application.LoadComponent(this, resourceLocater);

ただし、まだ同じエラーが発生します。

私がどのように進めようとしているのかについてアドバイスや提案があれば、非常に感謝しています.

単一の UI ウィンドウを表示するために相対 Uri を使用せずに、(現在のアプリケーション/プロジェクトの外部にある) XAML ファイルを読み込む別の方法はありますか? これを実行してビジネスロジックを定義するために実装する必要がある最低限のもの(この場合は少ない方が確実に信頼性が高い)についてのアドバイスは、非常に役立ちます...

事前にアドバイスをありがとう

J

編集: (およびブライアン S への返信):

返信ありがとうございます。また、素材に関する推奨事項もありがとうございます。WPFに必要なアーキテクチャを誤解している可能性は十分にあります...

したがって、その場合はお知らせください...私の理解は次のとおりです。

グラフィック構成、コンテンツ、レイアウトなどはすべてXAML ファイル内で指定されます。動作、相互作用、イベント処理などはコード ビハインドで指定されます。

XAML マークアップが作成されたら、設計したウィンドウをインスタンス化するために必要なことは、それをオブジェクトのツリーにロード/解析することだけであると仮定しました。 System.Windows.Window であり、XAML ファイル内で x:class="myClass" と同じクラスとして名前が付けられます。

以前に書いたものを読み直すと、状況についてそれほど明確ではなかったことに気付きました。ソリューションに複数のファイルを使用できますが、問題はありません。問題は次のように発生します。

2 つのファイルにまたがる部分的なクラス (file1.cs と file2.cs など) では、クラス メソッドは定義されている同じファイル内でのみ認識されます (実際にクラスをインスタンス化しない限り、その後でそのメソッドを呼び出すことができます)。 . したがって、たとえば、file1.cs で InitializeComponent() を指定してから、InitializeComponent() を参照するコンストラクターを file2 で定義することはできませんでした...それが理にかなっていることを願っています...

私ができることは、ファイルの外部でメソッドを参照する必要があるメソッドを定義しないようにすることです。したがって、部分クラスの使用を可能な限り回避します。

1 つのファイル (class1.cs など) でクラスを定義し、別のファイル (class2.cs など) からインスタンス化できます。

private class1 mynewclass1 = new class1(args)

私も使用できます:

'System.Windows.Application.LoadComponent(args);'

相対アドレス指定で問題が発生しているようですが、何を試しても.xamlファイルが見つからないようです..

相対アドレス指定を使用せずに xaml ファイルをロードする方法はありますか? XamlReader を見てきましたが、必要なことを実行できるかどうかはわかりません....

再度、感謝します、

J

4

1 に答える 1

0

従うと、WpfWindow.xaml ファイルを、同じディレクトリにあるルーズ リソース ファイルとして処理しようとしています。これは WPF の仕組みではありません。WpfWindow.xaml ファイルは分離コードを持つ部分クラスです。これは XAML リソース ディクショナリでは可能ですが、一緒にコンパイルする必要があるため、WpfWindow.xaml ファイルでは可能だとは思いません。

単一ファイル ソリューションが必要な場合は、さらに多くの作業が必要になりますが、XAML で行うことはすべてコードで行うことができます。したがって、ウィンドウの作成、コントロールの追加、それらの配置、動作の接続をコード ビハインドを通じてすべて行うことができます。明らかに、これは理想的なアプローチではありませんが、かなり重大な制限があるように思えます (私は NinjaTrader に詳しくありません)。

MSDN のドキュメントでは、WPF ウィンドウを手動で構築してレイアウトするために必要なコードについてのヘルプが提供されています。または、別のリソースを探している場合は、Charles Petzold によるApplications = Code + Markupで、コード ビハインドから WPF で行う必要があるすべてのことを実行できます。

于 2012-07-29T14:25:49.967 に答える