使用托盘中的资源调用WPF窗口

时间:2012-10-01 15:50:07

标签: c# wpf resources

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

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

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

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

以下是我的一些代码,以防它可能会有所帮助。

的App.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 does not display all data when called from the Tray.

非常感谢任何协助。

1 个答案:

答案 0 :(得分: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

他的完整解释可以找到here