我有一个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>
下图显示了应用程序在不同条件下的行为方式。
非常感谢任何协助。
答案 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。