你能从App.Xaml.cs调用MainWindow.Xaml.cs中的函数吗?

4

这似乎是可行的,但出于某种原因,正确的方法并没有浮现在我脑海中。我对C#和.NET都很陌生,所以希望这不是一个荒谬的问题 :)


3
我认为查看一些你的代码(即使它不起作用)会帮助提供一个相关的答案。 - R. Martinho Fernandes
1
有时静态方法或属性可能满足您的需求。http://msdn.microsoft.com/zh-cn/library/79b3xss3(VS.80).aspx - kenny
2个回答

8

不确定你为什么想这样做。这似乎不是最好的设计,但如果我不知道你在做什么的细节,我就无法发表评论。以下是如何完成此操作:

在App.Xaml.cs中:

var main = App.Current.MainWindow as MainWindow; // If not a static method, this.MainWindow would work
main.MyFunction();

请注意,您需要在启动后执行此操作。如果您想在启动之前执行此操作,则需要创建MainWindow对象并将其分配给this.MainWindow

var window = new MainWindow();
this.MainWindow = window;

window.Show();

window.MyFunction();

谢谢您的帮助。事实上,我想在启动期间使用该方法来设置值。 - nicky
你可以直接从App.xaml文件中清除StartupUri属性。这些代码将覆盖它。 - Josh G

2
很高兴看到有人开始学习编程!坚持下去,你会发现编程语言非常强大,并且最终你将了解设计方法论。
只有在下列几种情况下,你可能需要这样做:
1)调用与窗口无关的某些函数:
如果你的代码不依赖于MainWindow,并且没有引用MainWindow中的内容,那么你应该将它移到MainWindow的代码文件之外,并将其放在其他地方。你可以拥有任意数量的 .cs 文件,所以花些时间进行组织整理是值得的。日后你会感激自己的。
2)在窗口加载后执行一些初始化任务:
在窗口的代码中,在构造函数中InitializeComponent()调用之后插入代码。(这是一个没有返回类型的方法,只需写成 "public MainWindow() {"即可。
请记住,当你需要传递参数时,可以向构造函数添加参数。默认的无参数构造函数由Visual Studio创建,其中没有任何神奇之处。通过在窗口的代码中进行初始化而不是在窗口加载时进行初始化通常更好。
3)获取或输出窗口内的某些简单数据:
你学会如何创建自定义属性了吗?它非常简单。

1
谢谢建议!第二点和第三点很相关,您的建议对解决我的问题非常有帮助。实际上,我最终将一些代码从我的MainWindow移动到App.cs中来完成它。我有多个MainWindow实例,所以单个属性并没有帮助,但是我确实发现可以使用字符串集合属性。我将每个实例的值转换为单个字符串,并在启动和关闭期间使用该集合进行存储和检索。感谢您的帮助,Nicky。 - nicky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接