请原谅这个新手问题 - 我的背景是Unix,当我提到WPF时,我很绿......相对URI问题 - 在VS/Blend中设计WPF窗口,但使用不同的c#环境打开窗口
//上下文// 我需要使用Visual Studio或Blend设计一个基于WPF的单页面UI。另外,我需要这个在微软生成的解决方案之外是可移植的......这是因为我需要能够在不同的C#环境中定义业务逻辑,这是由名为'NinjaTrader'的软件公开的(用于那些可能使用它的人)。
我仅限于.NET 3.5
//附加信息// 现在,我想尽快得到验证的概念。我已经使用winforms成功实现了UI。通过简单地设计VS中的表单,然后将自动生成的设计器代码复制到我自己的抽象类定义中(比如'myForm')在NinjaTrader中。然后,我必须将myForm继承到'标准'NinjaTrader.Indicator类中的新类定义(这对于实例化myForm2类是必需的),并将外部类传递给myForm2的构造函数,并覆盖方法我需要业务逻辑,我可以在NinjaTrader.Indicator类的'OnStartUp'上显示UI,并实现我需要的行为。
//我的问题// 到目前为止WPF证明比较困难。我试图从'WPFWindow.xaml.cs'中拷贝类定义,还有'WPFWindow.g.cs'需要将一些.cs文件拷贝到内存中(由于NinjaTrader内部的限制,我必须为此使用一个文件),然后从另一个NinjaTrader.Indicator类实例化这个类。
一切都在同一个命名空间,虽然我一再难倒,当涉及到相对开放的,似乎我收到以下消息,不管我做什么:
无法找到资源“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);
不过,我仍然得到同样的错误。
如果任何人有任何建议/建议,我将非常感激,我可能会尝试着手。
是否有另一种方法可以使用相对Uri加载XAML文件(即当前应用程序/项目的外部文件),而不使用以显示单个UI窗口?任何关于什么是最低限度(在这种情况下,肯定更可靠的)我需要实现以实现这一点并定义业务逻辑,这将非常有帮助......
预先感谢任何建议
Ĵ
编辑:(&效应初探布赖恩S):
感谢您的答复,并且还用于对材料中的reccomendation。这是完全有可能的,我有误解参与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,但我不知道它可以做什么,我需要....一次
感谢,
Ĵ
感谢您的回应,也感谢材料的推荐。我完全有可能误解了WPF所涉及的必要架构... 因此,请让我知道是这样...我的理解如下: 图形组成,内容,布局等在XAML文件中被_all_指定。行为,交互,事件处理等在代码隐藏中指定。 – jd2496 2012-07-29 17:32:04
@ Brian S - 我不允许在这里提供足够的字符来为您提供适当的响应。因此,我将在原帖 – jd2496 2012-07-29 17:53:12
的底部添加一个编辑,因为现在我已经决定采取更简单的方式,并且在WPF中设计一个完整的应用程序,并使用WCF中的netnamedpipes在两者之间建立接口。我希望延迟可以忽略不计。谢谢。 Ĵ – jd2496 2012-07-30 12:59:29