0

请原谅新手的问题 - 我的背景是 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,虽然我不确定它是否能满足我的需求......

再次感谢,

Ĵ

4

1 回答 1

0

如果我遵循,您试图将 WpfWindow.xaml 文件视为位于同一目录中的松散资源文件。这不是 WPF 的工作方式 - WpfWindow.xaml 文件是带有代码隐藏的部分类。XAML 资源字典可以做到这一点,但我认为 WpfWindow.xaml 文件不可能,因为它们需要一起编译。

如果您想要一个单文件解决方案,则需要做更多的工作,但是您在 XAML 中所做的一切,都可以通过代码来完成。因此,您可以通过代码隐藏创建一个窗口、添加控件、定位它们并连接行为。显然,这不是理想的方法,但听起来您有一些相当大的限制(我不熟悉 NinjaTrader)。

MSDN 文档将提供有关手动构建和布局 WPF 窗口所需的代码的帮助,或者如果您正在寻找其他资源,Applications = Code + Markup由 Charles Petzold 完成,您需要从代码隐藏中对 WPF 执行任何操作。

于 2012-07-29T14:25:49.967 回答