他のアプリケーションがフルスクリーンで実行されている場合でも、ウィンドウを常に手前に表示することは可能ですか?私は今使用していますTopMost = true
しかし、他のアプリケーションがフルスクリーンで実行されている場合、私のものは見えなくなります。 WindowStyle = None
ちなみにウィンドウ。
編集:そして、他のウィンドウがコースを最小化しないようにします
これは、100%の時間は機能しませんが、状況を多少改善します。 Topmost = true
イベントのハンドラーでWindow.Deactivated
を設定できます。
private void Window_Deactivated(object sender, EventArgs e)
{
Window window = (Window)sender;
window.Topmost = true;
}
Deactivated
イベントは、アプリケーションがフォーカスを失うたびに(多くの場合、別のアプリケーションがTopmost
であるように要求するときに)呼び出されるため、この後にアプリケーションが一番上にリセットされます。
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();
私のための上記の解決策のどれも機能しなかったので、ここに私がやったことです。それは私にとって完璧に機能しました。
基本的に、トップに維持するには、フォーカスを失うイベントを設定して、トップに戻ります。
XAML:
PreviewLostKeyboardFocus="Window_PreviewLostKeyboardFocus"
コードビハインド:
private void Window_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
Window window = (Window)sender;
window.Topmost = true;
}
アプリケーションをEVERYTHING(以前は「Metro」と呼ばれていたWindows 8の開始インターフェイスを含む)の一番上に維持したい場合は、マニフェストファイルでUiAccess = "True"を指定できます。これは通常、スクリーンキーボードなどのアクセシビリティアプリケーションで使用されます。
メモリから3つのことを行う必要があります。
そのため、最近同じ要件に遭遇しました。 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()を呼び出して停止できます。これが同じことをしたい人に役立つことを願っています。
私はすべてを一番上に置きたいメインウィンドウを持っていました(ユーザーが「常に上」をチェックした場合)。
これでうまくいきました。これが誰かを助けることを願っています。
// 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;
}