web-dev-qa-db-ja.com

WPF常時オン

他のアプリケーションがフルスクリーンで実行されている場合でも、ウィンドウを常に手前に表示することは可能ですか?私は今使用していますTopMost = trueしかし、他のアプリケーションがフルスクリーンで実行されている場合、私のものは見えなくなります。 WindowStyle = Noneちなみにウィンドウ。

編集:そして、他のウィンドウがコースを最小化しないようにします

44
Kuba Wasilczyk

これは、100%の時間は機能しませんが、状況を多少改善します。 Topmost = true イベントのハンドラーでWindow.Deactivatedを設定できます。

private void Window_Deactivated(object sender, EventArgs e)
{
    Window window = (Window)sender;
    window.Topmost = true;
}

Deactivatedイベントは、アプリケーションがフォーカスを失うたびに(多くの場合、別のアプリケーションがTopmostであるように要求するときに)呼び出されるため、この後にアプリケーションが一番上にリセットされます。

43
Sheridan

MSDNのこのソリューションを試してみてください。うまくいくはずです。の中に Window Activated Event次のコードを追加します。

this.Width = System.Windows.SystemParameters.PrimaryScreenWidth;
this.Height = System.Windows.SystemParameters.PrimaryScreenHeight;
this.Topmost = true;
this.Top = 0;
this.Left=0;

DeActivated Event次のコードを追加します

this.Topmost = true;
this.Activate();

MSDNからのオリジナル投稿

12

私のための上記の解決策のどれも機能しなかったので、ここに私がやったことです。それは私にとって完璧に機能しました。

基本的に、トップに維持するには、フォーカスを失うイベントを設定して、トップに戻ります。

XAML:

PreviewLostKeyboardFocus="Window_PreviewLostKeyboardFocus"

コードビハインド:

private void Window_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
     {
          Window window = (Window)sender;
          window.Topmost = true;
     }
5
Travis Tubbs

アプリケーションをEVERYTHING(以前は「Metro」と呼ばれていたWindows 8の開始インターフェイスを含む)の一番上に維持したい場合は、マニフェストファイルでUiAccess = "True"を指定できます。これは通常、スクリーンキーボードなどのアクセシビリティアプリケーションで使用されます。

メモリから3つのことを行う必要があります。

  1. リクエストUiAccess = "True"
  2. 認識された証明書を使用して、アプリケーションのexeファイルに署名します。私のプロジェクトはオープンソースであるため、Certumから無料のコード署名証明書を取得しました。
  3. アプリケーションを「信頼できる場所」(私の場合はプログラムファイルディレクトリ)にインストールします。 「信頼できる場所」の公式な定義はありません。
2
Julius

そのため、最近同じ要件に遭遇しました。 2番目の回答だけでなく、最高評価の回答も適切に機能しなかったようです。私は、問題なく動作し、MVVMを使用したベストプラクティスにある程度準拠していると思われるソリューションを見つけました。

以下を使用すると、ウィンドウが強制的に最上部に移動し、他のソリューションのように変更時に無効になることはありません。

ステップ1:メインクライアントウィンドウ用に簡単な状態マネージャークラスを作成しました。 INotifyPropertyChangedを使用して、ウィンドウへの直接バインドを使用するときにプロパティの同期を維持しました。 (非常に重要)

public class ClientStateManager : INotifyPropertyChanged
{
    #region Private Variables
    private bool isForceToTop;
    private bool isClientEnabled;
    #endregion

    #region Public Properties
    public bool IsForceToTop
    {
        get { return isForceToTop; }
        set
        {
            isForceToTop = value;
            NotifyPropertyChanged();
        }
    }
    public bool IsClientEnabled
    {
        get { return isClientEnabled; }
        set
        {
            isClientEnabled = value;
            NotifyPropertyChanged();
        }
    }       
    #endregion

    #region Private Methods
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    #region Public Methods
    public void Lock() => this.IsClientEnabled = false;
    public void UnLock() => this.IsClientEnabled = true;
    public void SetTop() => this.IsForceToTop = true;
    public void UnSetTop() => this.IsForceToTop = false;
    #endregion

    #region Public Events
    public event PropertyChangedEventHandler PropertyChanged; 
    #endregion
}

ステップ2.1:状態マネージャークラスをViewModelに追加しました。 (MVVM)

  internal class MainWindowViewModel : INotifyPropertyChanged
  {
    #region Constructor
    public MainWindowViewModel() 
    {
        ClientStateManager = new ClientStateManager();
    }
    #endregion

    #region Public Properties  
    public ClientStateManager ClientStateManager { get; private set; }
    #endregion
  }

ステップ2.2:次に、ウィンドウデータコンテキストをビューモデルに設定します。

  private MainWindowViewModel model;
  private MainWindow()
  {
        InitializeComponent();
        this.model = new MainWindowViewModel();
        this.DataContext = model;
  }   

ステップ3:データバインディングをウィンドウに追加します。

  <Window x:Class="Intouch_Work.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ojects="clr-namespace:Framework.Object;Assembly=Framework"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"     
    mc:Ignorable="d"
    Title="Intouch" Height="800" Width="1100"
    x:Name="mainWindow"
    Topmost="{Binding Path=ClientStateManager.IsForceToTop, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">

したがって、View Model内で初期化された状態マネージャーオブジェクトを使用して、ウィンドウの状態を管理できるようになりました。状態マネージャーからSetTop()を呼び出してプッシュするか、UnSetTop()を呼び出して停止できます。これが同じことをしたい人に役立つことを願っています。

2
B.Spangenberg

私はすべてを一番上に置きたいメインウィンドウを持っていました(ユーザーが「常に上」をチェックした場合)。
これでうまくいきました。これが誰かを助けることを願っています。

        // If we want main to stay on top, we set the rest of the menus to Not be top 
        if (mnuViewMainWindowAlwaysOnTopo.IsChecked)
        {
            this.Topmost = true;
            foreach (Window window in Application.Current.Windows)
            {
                // Don't change for main window
                if (window.GetType().Name != this.GetType().Name)
                {
                    window.Topmost = false;
                }
            }
        }
        else
        {
            this.Topmost = false;
        }
1
pStan