0

我有一个 Windows 托盘项目,当单击设置时会打开一个 WPF 窗口。WPF 窗口打开并正确显示一些内容,但我有两个列表绑定到另一个具有奇怪行为的类。

这些列表作为设备显示在两个不同的选项卡上。在一个选项卡上,有一个可以启动设备的图形表示,另一个选项卡显示设备的设置。当 WPF 应用程序设置为启动项目时,一切正常。但是,当我从托盘启动它时,列表会正确加载,并显示在第一个选项卡中,可以在其中启动它们,但第二个选项卡显示不存在任何设备。它们都链接到相同的数据。

起初,我认为绑定存在问题,但经过几天尝试解决此问题后,我认为问题出在 App.xaml 中,其中存在对资源的引用。我怀疑因为我没有引用 App.xaml,所以没有加载资源,并且没有正确设置列表。项目工作和不工作的唯一区别是一个有WPF作为启动项目,另一个使用托盘调用WPF。

那么,我的问题是如何引用 App.xaml 以确保加载所需的资源。

以下是我的一些代码,以防万一。

应用程序.xaml

<Application x:Class="Sender_Receiver.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Shell.xaml">
<Application.Resources>
    <ResourceDictionary Source="Themes\Generic.xaml"/>
</Application.Resources>

当前调用打开 WPF

        private void settingsEvent_Click(object sender, EventArgs e)
    {
        gui = new Sender_Receiver.mainWindow(); // mainWindow() located in Shell.xaml
        gui.Show();
    }

显示设备的代码。CollapsibleSection 实现 Expander,RepeatControl 实现 ItemsControl。

<c:CollapsibleSection Header="Senders">
        <c:CollapsibleSection.CollapsedContent>
            <c:RepeatControl Margin="30,0,0,0" ItemsSource="{Binding SendersList}"  
                              ItemType="{x:Type m:Sender}"  List="{Binding SendersList}"  
                              ItemTemplate="{StaticResource SenderSummary}"/>
        </c:CollapsibleSection.CollapsedContent>
        <Border BorderThickness="1" BorderBrush="Chocolate" Margin="30,0,0,0">
            <c:RepeatControl  ItemsSource="{Binding SendersList}"  
                                  ItemType="{x:Type m:Sender}" 
                                  List="{Binding SendersList}"  
                                  ItemTemplate="{StaticResource SenderTemplate}"/>
        </Border>
    </c:CollapsibleSection>

下图显示了应用程序在不同条件下的表现。

从托盘调用时,WPF 不会显示所有数据。

任何帮助将不胜感激。

4

1 回答 1

0

我终于想通了这一点。必须调用整个 WPF 应用程序才能运行,而不是实例化 UI。这将导致 App.xaml 加载字典,然后其他 WPF 表单可以访问它。这是通过以下代码完成的:

private void settingsEvent_Click(object sender, EventArgs e)
    {
        if (gui == null)
        {
            gui = new App();
            gui.MainWindow = new mainWindow();
            gui.InitializeComponent();
        }
        else
        {
            gui.InitializeComponent();
            gui.MainWindow.Show();
            gui.MainWindow = new mainWindow();
        }
    }
    private static App app = new App();

您必须继续将 mainWindow 添加回应用程序,因为在窗口显示时它似乎设置为 null。

这是通过实验发现的,所以我确信这不是最佳实践,但它确实有效,而且现在,这正是我所需要的。

编辑

然而,就我的目的而言,这仍然行不通。我可以只打开一次“设置”窗口,或者在第一次打开它时无法让事件处理程序对其进行处理。最后,乔希想出了正确的答案:

Process myProcess = new Process();
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = "C:\\mysettingsapp\\mysettingsapp.exe"; // replace with path to your settings app
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
// the process is started, now wait for it to finish
myProcess.WaitForExit();  // use WaitForExit(int) to establish a timeout

他的完整解释可以在这里找到。

于 2012-10-02T15:18:49.663 回答