根据WindowStartupLocation属性的MSDN文档:
设置CenterScreen会使窗口位于包含鼠标光标的屏幕中央.
虽然CenterScreen字段的MSDN文档本身定义得不那么明确:
窗口的启动位置是打开它的屏幕的中心.
一个简单的测试显示这应该工作:
MainWindow.xaml
<Window x:Class="CenterScreenTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Button Click="button_Click">Open Window</Button>
</Window>
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml.cs
using System.Windows;
namespace CenterScreenTest
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
void button_Click(object sender, RoutedEventArgs e)
{
Window window = new Window();
window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
window.Show();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果在双监视器系统上测试它,您可以看到当您单击按钮时,新窗口将位于鼠标光标所在的屏幕上.这正是它应该如何运作的.
但是,如果在显示窗口之前尝试将窗口设置为最大化,则新窗口将仅在启动应用程序的显示器上最大化.将button_Click事件处理程序更改为以下内容以查看我的意思:
void button_Click(object sender, RoutedEventArgs e)
{
Window window = new Window();
window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
window.WindowState = WindowState.Maximized;
window.Show();
}
Run Code Online (Sandbox Code Playgroud)
现在,无论单击按钮时鼠标光标在哪里,窗口都只会在启动应用程序的屏幕上最大化.如果在显示窗口状态后将其设置为最大化,则CenterScreen可正常工作.这相当于用户最大化窗口.例如: …
我已将主窗口状态设置为"最大化",但问题是我的应用程序将填满整个屏幕甚至任务栏.我究竟做错了什么 ?我正在使用分辨率为1600*900的Windows 2008 R2
这是Xaml:
<Window x:Class="RadinFarazJamAutomationSystem.wndMain"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:RadinFarazJamAutomationSystem"
xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
Title="MyName" FontFamily="Tahoma" FontSize="12" Name="mainWindow" WindowState="Maximized" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:my="clr-namespace:RadinFarazJamAutomationSystem.Calendare.UC" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Loaded="mainWindow_Loaded" FlowDirection="LeftToRight"
ResizeMode="NoResize" Closed="mainWindow_Closed">
Run Code Online (Sandbox Code Playgroud) 所以我想立即,因为程序的这部分依赖于速度,当我的主窗体中的windowstate被更改时触发一个函数.我需要它是这样的:
private void goButton_Click(object sender, EventArgs e)
{
//Code
}
Run Code Online (Sandbox Code Playgroud)
我检查了表单的事件选项卡,我没有WindowStateChanged等.我该怎么做?
表单将重新调整大小,因此检查大小更改时将无效.
我的应用程序有一个托盘图标,双击时会隐藏或显示应用程序窗口.我的问题是,如果隐藏窗口处于最小化状态,我似乎无法将窗口置于前台.
例如,假设用户最小化应用程序,然后双击托盘图标.然后隐藏应用程序窗口并从任务栏中消失.当用户再次双击托盘图标时,应该出现应用程序窗口,即应该从最小化状态恢复并将其带到前台.
下面的代码应该这样做,但由于某种原因,它不会:
private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
if (this.Visibility == Visibility.Hidden)
{
this.Visibility = Visibility.Visible;
this.WindowState = WindowState.Normal;
this.Activate();
}
...
}
Run Code Online (Sandbox Code Playgroud)
应用程序保持最小化,不会被带到前台.Activate()返回true,后续调用TrayIcon_DoubleClick()表示状态确实设置为Normal.
我将主窗口的"WindowState"属性绑定到我的ViewModel,以便通过命令更改窗口的状态,但是第一次最小化窗口时,它最小化,就像Excel文件中的工作表一样.是否有解决此问题或将"WindowState"属性绑定到我的ViewModel的正确方法,以便窗口最小化?
我读到Load事件应该在创建窗口句柄之后但在窗口实际可见之前被触发.在大多数情况下,这似乎是真的.但是,我发现当我创建一个WindowState属性设置为FormWindowState.Maximized(通过VS设计器,或在构造函数中以编程方式设置)的窗体时,窗口在Load事件触发之前变得可见.例如:
using System;
using System.Windows.Forms;
namespace MyApplication
{
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
WindowState = FormWindowState.Maximized;
}
protected override void OnLoad(EventArgs e)
{
MessageBox.Show("OnLoad - notice that the window is already visible");
base.OnLoad(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这反过来导致显示的形式闪烁很多,Form.Load同时在窗口可见时调整其控件(在事件期间布局)的大小.如果我没有将状态设置为最大化,则在显示窗口之前完成所有调整大小(这是我预期的).
我可以推迟设置WindowState直到Load事件结束,但仍然会导致大量闪烁,因为窗口变得可见,然后所有控件都会调整大小.
有什么想法吗?
在我们的项目中,我们保存了窗口大小,位置和最小化/最大化设置,因此我们可以在重新打开窗口时以完全相同的点和大小打开窗口.所有这一切都运行得很好,使用Window-Behavior本文底部的-class.
但问题是,当我们使用Win-button +箭头时; 这会将屏幕与屏幕一侧对齐,但这并未正确保存在行为中.相反,它在我使用Win +箭头对齐之前保存了屏幕的位置和大小,这就是它再次打开的位置.
我试图使用Window的Left,Top,ActualWidth并ActualHeight在SaveWindowState-方法(注:AssociatedObject在这个方法中的窗口.)但是,Left和Top似乎由约20-40像素被关闭,并保存右键和左键使用的ActualWidth,ActualHeight和当前的屏幕宽度/高度(使用多个显示器时)也有点痛苦.
那么,当用户使用Win +箭头对齐Window然后关闭它时,有没有办法在窗口设置中保存正确的位置和大小?
WindowSettingsBehavior:
using System;
using System.ComponentModel;
using System.Configuration;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Interop;
namespace NatWa.MidOffice.Behaviors
{
/// <summary>
/// Persists a Window's Size, Location and WindowState to UserScopeSettings
/// </summary>
public class WindowSettingsBehavior : Behavior<Window>
{
[DllImport("user32.dll")]
static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref Windowplacement …Run Code Online (Sandbox Code Playgroud) 在WPF中,有没有办法检查触发器中窗口的"WindowState"属性?我尝试使用"0","最小化"和"WindowState.Minimized"的值.
例:
<Window.Triggers>
<Trigger Property="WindowState" Value="Minimized">
<Setter Property="ShowInTaskBar" Value="False" />
</Trigger>
</Window.Triggers>
Run Code Online (Sandbox Code Playgroud) 所以我创建了一个带有系统托盘图标的窗口.窗口开始最小化,并在单击系统托盘图标时重新显示.但是,它仅在您单击最小化按钮时有效.如果单击红色退出按钮,窗口将消失,系统托盘图标将保留(应该如此),但是当您单击它时,程序将抛出错误.
窗口关闭后,无法设置可见性或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle.
这是相关的代码
public partial class MainWindow : Window
{
public static NotifyIcon icon;
List<string> food = new List<string>();
bool on = false;
public MainWindow()
{
InitializeComponent();
food.Add("Breakfast");
food.Add("Soups");
food.Add("Vegetables");
food.Add("Crab roll");
food.Add("Sushi");
food.Add("Egg rolls");
food.Add("Salad");
MainWindow.icon = new NotifyIcon();
window1.WindowState = WindowState.Minimized;
icon.Icon = new System.Drawing.Icon("favicon.ico");
icon.Visible = true;
icon.Click += new EventHandler(icon_Click);
icon.BalloonTipClicked += new EventHandler(icon_BalloonTipClicked);
icon.DoubleClick += new EventHandler(icon_DoubleClick);
icon.BalloonTipClosed += new EventHandler(icon_BalloonTipClosed);
icon.MouseMove += new System.Windows.Forms.MouseEventHandler(icon_MouseMove);
StateChanged += new EventHandler(MainWindow_StateChanged);
}
void icon_BalloonTipClicked(object sender, EventArgs e) …Run Code Online (Sandbox Code Playgroud) 有谁知道如何从另一个线程更改窗体的窗口状态?这是我正在使用的代码:
private void button4_Click(object sender, EventArgs e)
{
string pathe = label1.Text;
string name = Path.GetFileName(pathe);
pathe = pathe.Replace(name, "");
string runpath = label2.Text;
Process process;
process = new Process();
process.EnableRaisingEvents = true;
process.Exited += new System.EventHandler(process_Exited);
process.StartInfo.FileName = @runpath;
process.StartInfo.WorkingDirectory = @pathe;
process.Start();
WindowState = FormWindowState.Minimized;
}
private void process_Exited(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Normal;
}
Run Code Online (Sandbox Code Playgroud)
这意味着运行程序并最小化,然后在程序关闭后返回正常状态.虽然我收到此错误"跨线程操作无效:控件'Form1'从其创建的线程以外的线程访问." 知道如何让这个工作吗?
以下面的代码为例;
if (Convert.ToString(frm.WindowState) == "Minimized")
Layout.WindowState = "Maximized";
else
Layout.WindowState = Convert.ToString(frm.WindowState);
Run Code Online (Sandbox Code Playgroud)
我们正在分析窗口状态的字符串定义,即"最小化".
这种字符串描述会在文化之间发生变
最后,在这段代码中,是否有一个Enum我们可以使用它来检查窗口状态?
我们可以重构这段代码吗?
我已将表单设置为MDI表单的子表单,其窗口状态设置为最大化.
当我从MDI容器中打开该表单时,它不会以最大化状态打开.为什么会发生这种情况?如何才能使其最大化?
这就是我从mdi容器中显示子表单的方式.
private void ShowNewForm(object sender, EventArgs e)
{
FormChild childForm = new FormChild ();
childForm.MdiParent = this;
childForm.WindowState = FormWindowState.Maximized;
childForm.Text = "Window " + childFormNumber++;
childForm.Show();
}
Run Code Online (Sandbox Code Playgroud)