请原谅新手的问题 - 我的背景是 Unix 并且在 WPF 方面我很绿色......
//上下文// 我需要设计一个基于 WPF 的单页 UI,使用 Visual Studio 或 Blend。
此外,我需要将其移植到微软生成的解决方案之外......这是因为我需要能够在不同的 c# 环境中定义业务逻辑,该环境由名为“NinjaTrader”的软件公开(对于那些可能使用它)。
我仅限于 .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);
但是,我仍然遇到同样的错误。
如果有人对我如何尝试进行任何建议/建议,我将不胜感激。
是否有另一种方法可以加载 XAML 文件(当前应用程序/项目外部),而不使用相对 Uri 来显示单个 UI 窗口?任何关于最低限度的建议(在这种情况下肯定更可靠)我需要实施才能做到这一点并定义业务逻辑,这将非常有帮助......
提前感谢您的任何建议
Ĵ
编辑:(和对布赖恩 S 的回应):
感谢您的回复,也感谢您对材料的推荐。我完全有可能误解了 WPF 所涉及的必要架构......
因此,请让我知道是这样的……我的理解如下:
图形组成、内容、布局等都在 XAML 文件中指定。行为、交互、事件处理等在代码隐藏中指定。
一旦编写了 XAML 标记,我就假设,为了实例化我设计的窗口,我需要做的就是将它加载/解析到一个对象树中 - 比如说 - 一个继承的类System.Windows.Window,并且在 XAML 文件中命名为与 x:class="myClass" 中相同的类。
在重新阅读我之前写的内容后,我意识到我对情况并不是很清楚。我可以使用多个文件来解决问题,没有问题,问题出现如下:
对于跨 2 个文件的部分类 - 比如说 file1.cs 和 file2.cs,类方法只能在定义它们的同一文件中被识别(除非我实际实例化类 - 之后我可以调用它的方法) . 所以 - 例如 - 我无法在 file1.cs 中指定 InitializeComponent(),然后在 file2 中定义一个引用 InitializeComponent() 的构造函数......我希望这是有道理的......
我能做的似乎可行的是避免在我需要引用它们的文件之外定义方法。因此,尽可能避免使用部分类。
我可以在一个文件(比如class1.cs)中定义一个类,然后从另一个文件(比如class2.cs)实例化它没问题,通过使用:
private class1 mynewclass1 = new class1(args)
我还可以使用:
'System.Windows.Application.LoadComponent(args);'
尽管我似乎遇到了相对寻址的问题,但无论我尝试什么,它似乎都找不到 .xaml 文件。
有没有一种方法可以尝试在不使用相对寻址的情况下加载 xaml 文件?我一直在看 XamlReader,虽然我不确定它是否能满足我的需求......
再次感谢,
Ĵ