全画面表示に最大化できるようにアプリケーションを作成したいのですが、ウィンドウのタスクバーとタイトルバーも非表示になります。そして、それはボタンによってトリガーされるはずです。
このようにアプリケーションウィンドウを開発しようとしています。
以下にコードスニペットを追加
<controls:MetroWindow x:Class="EDUI.MainWindow"
xmlns:controls="clr-namespace:MahApps.Metro.Controls;Assembly=MahApps.Metro"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:EDiscoveryCore;Assembly=EDiscoveryCore"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="eDi" BorderBrush="SkyBlue" BorderThickness="2" Height="999" Width="1071" WindowState="Maximized" x:Name="MainWindows">
これを試して:
<Window ShowTitleBar="False" IgnoreTaskbarOnMaximize="True">
WindowStyleをnoneに設定し、WindowStateをMaximizedに設定する必要があります。
<Window ...
WindowStyle="None"
WindowState="Maximized">
ResizeModeをNoResizeに、WindowStateをMaximizedに設定する必要があります。
<Window ...
ResizeMode="NoResize" WindowState="Maximized">
タスクバーが消えない場合は、次のように、ウィンドウスタイルを変更する前と後にウィンドウの可視性を変更すると役立つ場合があります。
private void MainWindow_StateChanged(object sender, EventArgs e) {
if (this.WindowState == WindowState.Maximized) {
// hide the window before changing window style
this.Visibility = Visibility.Collapsed;
this.Topmost = true;
this.WindowStyle = WindowStyle.None;
this.ResizeMode = ResizeMode.NoResize;
// re-show the window after changing style
this.Visibility = Visibility.Visible;
}
else {
this.Topmost = false;
this.WindowStyle = WindowStyle.SingleBorderWindow;
this.ResizeMode = ResizeMode.CanResize;
}
}
WindowStyleをnoneに設定するだけです。
<Window ...
WindowStyle="None">
ステップ1:タスクバーの静的メソッドHide()およびShow()を使用してクラスを作成する
public class Taskbar
{
[DllImport("user32.dll")]
private static extern int FindWindow(string className, string windowText);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int command);
private const int SW_HIDE = 0;
private const int SW_SHOW = 1;
protected static int Handle
{
get
{
return FindWindow("Shell_TrayWnd", "");
}
}
private Taskbar()
{
// hide ctor
}
public static void Show()
{
ShowWindow(Handle, SW_SHOW);
}
public static void Hide()
{
ShowWindow(Handle, SW_HIDE);
}
}
ステップ2:ウィンドウを閉じるイベントに接続して、Alt + F4でウィンドウが閉じるときにタスクバーを元に戻す
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Taskbar.Show();
}
タスクバーを非表示にして全画面表示:
Taskbar.Hide();
WindowStyle = WindowStyle.None;
WindowState = WindowState.Maximized;
ResizeMode = ResizeMode.NoResize;
Width = System.Windows.SystemParameters.PrimaryScreenWidth;
Height = System.Windows.SystemParameters.PrimaryScreenHeight;
Topmost = true;
Left = 0;
Top = 0;
タスクバーを表示してウィンドウで実行
Taskbar.Show();
WindowStyle = WindowStyle.SingleBorderWindow;
WindowState = WindowState.Normal;
ResizeMode = ResizeMode.CanResize;
Width = System.Windows.SystemParameters.WorkArea.Width-100;
Height = System.Windows.SystemParameters.WorkArea.Height-100;
Topmost = false;
Left = 0;
Top = 0;
Windows 10 1703(Creators Update)でテスト済み
この問題は、タスクバーがウィンドウの上に表示されたままでした。私が使用している現在の解決策は、ウィンドウを短時間最上位に設定してから、それをfalseに戻すことです(ウィンドウでAlt + Tabを使用するとうまくいきます)
private Timer t;
public void OnLoad()
{
var window = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
StartTopmostTimer(window);
}
private void StartTopmostTimer(Window window)
{
t = new Timer(o => SetTopMostFalse(window), null, 1000, Timeout.Infinite);
}
private void SetTopMostFalse(Window window)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
window.Topmost = false;
}));
t.Dispose();
}
また、このコードを使用して、全画面モードとウィンドウモードを切り替えます。
public void SwitchFullScreen()
{
var window = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
if (window != null)
{
if (window.WindowStyle == WindowStyle.None)
{
window.WindowStyle = WindowStyle.SingleBorderWindow;
window.WindowState = state;
}
else
{
state = window.WindowState;
window.WindowStyle = WindowStyle.None;
window.WindowState = WindowState.Maximized;
window.Topmost = true;
StartTopmostTimer(window);
}
}
}
上記のどれも私にとってはうまくいきませんでした。 Windows APIを使用してもタスクバーは非表示になりますが、ウィンドウが最大化された後もスペースが残ります。機能したのは、Maximizedプロパティを設定せず、デスクトップのサイズを取得して、これらを設定することです。
Top = 0;
Left = 0;
Width = width_of_your_desktop;
Height = height_of_your_desktop;
最上位を設定する必要さえありません!画面サイズを取得するには、SystemParameters.PrimaryScreenHeightおよびPrimaryScreenWidthの値を使用するか、ウィンドウが現在表示されている画面を取得する場合は、下からGetMonitorFromWindowを使用します。
[StructLayout(LayoutKind.Sequential)]
private struct MonitorInfo
{
public uint cbSize;
public Rect2 rcMonitor;
public Rect2 rcWork;
public uint dwFlags;
}
[StructLayout(LayoutKind.Sequential)]
private struct Rect2
{
public int left;
public int top;
public int right;
public int bottom;
}
private const int MONITOR_DEFAULTTONULL = 0;
private const int MONITOR_DEFAULTTOPRIMARY = 1;
private const int MONITOR_DEFAULTTONEAREST = 2;
[DllImport("user32.dll")]
private static extern IntPtr MonitorFromWindow(IntPtr hwnd, int flags);
[DllImport("user32.dll")]
private static extern bool GetMonitorInfo(IntPtr hwnd, ref MonitorInfo mInfo);
public static Rect GetMonitorFromWindow(Window win) {
var mi = new MonitorInfo();
mi.cbSize = (uint)Marshal.SizeOf(mi);
var hwmon = MonitorFromWindow(new System.Windows.Interop.WindowInteropHelper(win).EnsureHandle(), MONITOR_DEFAULTTONULL);
if (hwmon != null && GetMonitorInfo(hwmon, ref mi)) {
//convert to device-independent vaues
var mon = mi.rcMonitor;
Point realp1;
Point realp2;
var trans = PresentationSource.FromVisual(win).CompositionTarget.TransformFromDevice;
realp1 = trans.Transform(new Point(mon.left, mon.top));
realp2 = trans.Transform(new Point(mon.right, mon.bottom));
return new Rect(realp1, realp2);
}
else
throw new Exception("Failed to get monitor info.");
}
このイベントハンドラーをフォームのLoadedイベントにフックするだけで問題なく動作します。
フォームのコンストラクタにこのようなものを適用しないでください(これは私には機能しません)。
private void aWindow_Loaded(object sender, RoutedEventArgs e)
{
MaxHeight = SystemParameters.FullPrimaryScreenHeight;
MaxWidth = SystemParameters.FullPrimaryScreenWidth;
Width = SystemParameters.FullPrimaryScreenWidth;
Height = SystemParameters.FullPrimaryScreenHeight;
WindowState = WindowState.Maximized;
ResizeMode = ResizeMode.NoResize;
Left = 0;
Top = 0;
Topmost = true;
ShowInTaskbar = false;
//throw new NotImplementedException();
}