Почему TopMost = True не всегда работает? - PullRequest
1 голос
/ 21 февраля 2011

У меня есть простое маленькое приложение, которое должно плавать поверх всех остальных моих окон.Через несколько часов я замечу, что это больше не поверх всех моих других окон, и мне было интересно, если бы кто-нибудь знал, почему это происходит.

За это время я открыл новые приложения (в основном продукты MS 2010)), несколько раз блокировал / разблокировал мой компьютер, нажимал ярлык на рабочем столе и перемещал приложение по экрану (иногда между экранами, поскольку у меня два монитора).

Мне не удалось продублировать поведениепо требованию, однако это происходит как минимум раз в день.Когда он перестает оставаться сверху, он скрывается, когда я нажимаю на ярлык на рабочем столе, поэтому я думаю, что свойство TopMost каким-то образом получает значение false.

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

Приложение действительно простое ... онопросто работает как виртуальные шахматные часы и позволяет мне отслеживать время, потраченное на обработку обращений в службу поддержки против фактической разработки.Событие MouseDown просто запускает режим перетаскивания приложения, поскольку для WindowStyle установлено значение None.

Я использую WindowsXP, и приложение было встроено в .Net 4.0.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Возможно, вы могли бы захватить событие Деактивированный и снова заставить Окно снова включить?

На самом деле просто предположение, но стоило бы исследовать, если установка Topmost = False тогда Topmost = True в нужное время исправит это.

1 голос
/ 06 сентября 2012

Альтернативное решение

в вашем главном окне 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!" });
0 голосов
/ 18 марта 2014

Этот вопрос довольно старый, но я еще не нашел реальных решений, так что вот моя идея для всех, кто сталкивается с проблемой:

Попробуйте совет Тома, но вместо того, чтобы просто проверить, есть ли TopMostстановится использовать ShowWindowAsync, чтобы заставить его показывать снова.

Единственное, что может быть проблемой в том, что это может отодвинуть фокус от активного приложения, но я знаю, что есть способ сделать это ""Фокус-меньше", если это вариант для вас.

О том, чтобы попробовать это для себя, поэтому я обновлю этот ответ, если он работает с деталями.

...