0

[設定]をクリックするとWPFウィンドウを開くWindowsトレイプロジェクトがあります。WPFウィンドウが開き、一部のコンテンツが正しく表示されますが、動作がおかしい別のクラスにバインドされた2つのリストがあります。

これらのリストは、デバイスとして2つの異なるタブに表示されます。1つのタブには、デバイスを起動できるグラフィック表現があり、もう1つのタブには、デバイスの設定が表示されます。WPFアプリケーションがスタートアッププロジェクトとして設定されている場合、すべてが完全に機能します。ただし、トレイから起動すると、リストが正しく読み込まれ、最初のタブに表示されて起動できますが、2番目のタブにはデバイスが表示されません。それらは両方とも同じデータにリンクされています。

最初はバインディングに問題があると思いましたが、これを解決しようとして数日後、問題はリソースへの参照がある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は、トレイから呼び出されたときにすべてのデータを表示するわけではありません。

どんな援助でも大歓迎です。

4

1 に答える 1

0

私はついにこれを理解しました。UIをインスタンス化する代わりに、WPFアプリケーション全体を呼び出して実行する必要があります。これにより、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();

ウィンドウが表示されたときにnullに設定されているように見えるため、メインウィンドウをアプリに追加し続ける必要があります。

これは実験によって発見されたので、ベストプラクティスではないと確信していますが、機能し、今はそれが必要でした。

編集

しかし、私の目的では、これはまだ機能していませんでした。[設定]ウィンドウを1回だけ開くか、最初に開いたときにイベントハンドラーを機能させることができませんでした。最後に、ジョシュは正しい答えを思いついた:

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 に答える