2012-07-29 60 views
0

请原谅这个新手问题 - 我的背景是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,但我不知道它可以做什么,我需要....一次

感谢,

Ĵ

回答

0

如果我跟着,你想治疗WpfWindow.xaml文件作为位于同一目录中的松散资源文件。这不是WPF的工作原理 - WpfWindow.xaml文件是一个带有代码隐藏的分部类。这对XAML资源字典来说是可能的,但我不相信WpfWindow.xaml文件是可能的,因为它们需要一起编译。

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

MSDN文档将提供手动构建和布局WPF窗口所需的代码方面的帮助,或者您正在寻找由Charles Petzold提供的另一个资源Applications = Code + Markup,通过代码隐藏执行WPF所需的任何操作。

+0

感谢您的回应,也感谢材料的推荐。我完全有可能误解了WPF所涉及的必要架构... 因此,请让我知道是这样...我的理解如下: 图形组成,内容,布局等在XAML文件中被_all_指定。行为,交互,事件处理等在代码隐藏中指定。 – jd2496 2012-07-29 17:32:04

+0

@ Brian S - 我不允许在这里提供足够的字符来为您提供适当的响应。因此,我将在原帖 – jd2496 2012-07-29 17:53:12

+0

的底部添加一个编辑,因为现在我已经决定采取更简单的方式,并且在WPF中设计一个完整的应用程序,并使用WCF中的netnamedpipes在两者之间建立接口。我希望延迟可以忽略不计。谢谢。 Ĵ – jd2496 2012-07-30 12:59:29