1

小さくて、他のすべてのウィンドウの上に浮かぶはずのシンプルなアプリがあります。数時間後、それが他のすべてのウィンドウの上に表示されなくなったことに気付くでしょう。なぜこれが起こるのか誰かが知っているのだろうかと思っていました.

この間、新しいアプリケーション (主に MS 2010 製品) を開き、PC を数回ロック/ロック解除し、デスクトップ ショートカットを押して、画面上でアプリを移動しました (モニターが 2 つあるため、画面間を移動することもあります)。

オンデマンドで動作を再現することはできませんでしたが、少なくとも 1 日に 1 回発生します。TopMostトップに留まるのをやめると、デスクトップのショートカットを押すと隠れるので、どういうわけかプロパティがfalseに設定されていると思います。

<Window AllowsTransparency="True" 
        WindowStyle="None"
        Topmost="True"
        SizeToContent="WidthAndHeight"
        MouseDown="Window_MouseDown"
        ShowInTaskbar="False"
        Background="Transparent" 
        SnapsToDevicePixels="True">

このアプリは本当にシンプルです...仮想チェス時計のように機能し、ヘルプ デスクへの電話の処理と実際の開発に費やした時間を追跡できます。WindowStyle が None に設定されているため、MouseDown イベントはアプリケーションのドラッグ アンド ドロップ動作をトリガーするだけです。

私は WindowsXP を実行しており、アプリは .Net 4.0 でビルドされています。

4

3 に答える 3

3

おそらく、Deactivatedイベントをキャプチャして、ウィンドウを強制的に再び上に戻すことができますか?

本当に推測ですが、適切なタイミングで設定すると修正されるかどうかを調査する価値がありTopmost = FalseますTopmost = True

于 2011-02-21T14:29:20.760 に答える
1

代替ソリューション

あなたのWPFメインウィンドウで

namespace YourNameSpace
{  
     public partial class MainWindow : Window
     {
    public MainWindow()
    {
        InitializeComponent();
    }

    private delegate void MessageBoxDelegate(DelegatePara para);

    public void ShowAwMessageBox(DelegatePara para)
    {            
        this.Dispatcher.BeginInvoke(new MessageBoxDelegate(ShowMessageBox), para);
    }

    private void ShowMessageBox(DelegatePara para)
    {
        this.Topmost = true;
        int typ = para.count;
        string msg = para.Msg;
        switch (typ)
        {
            case 0:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Information);
                break;
            case 1:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Error);
                break;
            case 2:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Question);
                break;
            default:
                MessageBox.Show(this, msg, "Auswertung", MessageBoxButton.OK, MessageBoxImage.Information);
                break;
        }
    }
}

 public class DelegatePara
 {
    public int count {get;set; }
    public string Msg {get;set; }
 }
}

次にMainWind、スレッド内であっても、必要な場所からハンドルを使用して呼び出します

this.MyWind.ShowRlvAwMessageBox(new DelegatePara() { count = 0, Msg = "Hallo World!" });
于 2012-09-06T13:36:45.213 に答える