如何从另一个XAML代码中访问后台的变量?

3
我正在尝试制作一个基于WPF的通讯程序,我的解决方案包含app.xaml和app.xaml.cs、mainwindow.xaml和mainwindow.xaml.cs以及另外两个xaml页面,第一个用于连接,第二个用于Messenger核心{联系人,状态等}。我有一个agsxmpp库,可以帮助我进行连接。最好在哪个.cs文件中定义和初始化连接,并且如何从另一个.cs文件中访问它(以及它的事件处理程序)?顺便说一下,这个问题总是困扰着我 :(
1个回答

0

一个默认的WPF模板将会像这样,带有一个StartupUri属性。

<Application x:Class="WpfApplication1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml">
    <Application.Resources>

    </Application.Resources>
</Application>

你需要移除StartupUri,并使用Startup事件,以便可以手动创建主窗口。
<Application x:Class="WpfApplication1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Startup="Application_Startup">
    <Application.Resources>

    </Application.Resources>
</Application>


namespace WpfApplication1
{

    public partial class App : Application
    {
        private XmppClientConnection _client = new XmppClientConnection ( );

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            var mainWindow = new Window1();
            mainWindow.Show();
        }
    }
}

然后,您可以向Window1类添加一个新的构造函数,以便您可以传递需要引用的对象。
public partial class Window1 : Window
{
    private XmppClientConnection _client;

    public Window1()
    {
        InitializeComponent();
    }

    public Window1(XmppClientConnection client):this()
    {
        _client = client;
    }
}

像这样:

private void Application_Startup(object sender, StartupEventArgs e)
{
    _client = new XmppClientConnection();
    var mainWindow = new Window1(client);
    mainWindow.Show();
}

@panamack:感谢您的评论,但您完全没有理解我的意思。 我应该把这段代码放在哪里?public XmppClientConnection Client = new XmppClientConnection();以便从其他cs类中访问它。 - Ahmed Ghoneim
@Ahmed 我会更新我的代码,以便在那个上下文中更清晰明了。 - Grokodile
@Ahmed,你可以在应用程序的入口点实例化XmppClientConnection,并在创建需要它的对象时传递它,或者另一种选择是将其包装在singleton中,并从任何需要引用它的类中引用该单例。 - Grokodile
@panamak:抱歉打扰一下,如果我在App.cs中为连接创建事件处理程序,而事件发生在window1.cs中,它会被处理吗? - Ahmed Ghoneim
@Ahmed,如果在App.cs中订阅了XmppClientConnection对象的事件处理程序,并将同一实例传递给Window1,然后触发了一个事件,那么是的,App.cs事件处理程序将处理该事件,以及您随后订阅的任何其他处理程序。 - Grokodile

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