gpt4 book ai didi

c# - OnActivated 在构造函数期间

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:41 27 4
gpt4 key购买 nike

Form 的构造函数中,当我触摸特定属性(即 Width 属性)时,它会立即调用 OnActivated ()。我只在运行 Windows Embedded 7 和它附带的 .NET 3.5 的设备上注意到这种行为。

这是我用来重现问题的代码:

static class Program
{
[MTAThread]
static void Main()
{
new MyForm();
}
}

public class MyForm : Form
{
public MyForm()
{
Width = 100;
}

protected override void OnActivated(EventArgs e)
{
MessageBox.Show("Activated!");
}
}

(请注意,我既没有Show()也没有使用Application.Run())

在我的桌面或 WinCE 5 设备上运行以上代码不显示 MessageBox。在我的 Windows Embedded 7 设备上,MessageBox 出现,在单击“确定”后它重新出现,因为再次调用了 OnActivated()

设备制造商告诉我这是一个特定于操作系统的问题,谁能确认 Windows Embedded 7 应该如何“处理他的表单”?

最佳答案

我在装有 .NET CF 3.5 的 Windows CE 5.0 设备上试过这个,看看我是否遇到了与您相同的行为。使用完全相同的代码,我没有调用 OnActivated。设置宽度不会导致调用 OnActivated,即使在使用 Application.Run() 时也是如此。事实上,似乎必须显示 Form 才能触发 Activate,因为我尝试显式调用 Activate()。

因此,这似乎是 Windows Embedded 7 与以前版本的 Windows CE 相比所做的事情。我还尝试使用 Reflector 查看 CompactFramework .NET .dll,但我没有在 .NET 中找到任何代码,当它的宽度改变时会激活表单。 Width 不是 Form 的属性(它是 Control 的属性),并且 Form 似乎没有以任何方式处理调整大小事件,这将允许它调用其 Activate 方法。

作为可能的解决方法,我确实有一个建议给您。即使我显式调用 Activate(),以下代码也阻止了 Activate 的完全发生;

试一试:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
DisableActivate();
Activate(); // No call is made to OnActivated
EnableActivate();
}

protected override void OnActivated(EventArgs e)
{
Debug.WriteLine("Activated");
}

private void DisableActivate()
{
WindowStyles style = GetWindowLong(Handle, GWL_EX_STYLE);
style |= WindowStyles.WS_EX_NOACTIVATE;
SetWindowLong(Handle, GWL_EX_STYLE, style);
}

private void EnableActivate()
{
WindowStyles style = GetWindowLong(Handle, GWL_EX_STYLE);
style &= ~WindowStyles.WS_EX_NOACTIVATE;
SetWindowLong(Handle, GWL_EX_STYLE, style);
}

public const int GWL_EX_STYLE = -20;

[DllImport("coredll.dll", SetLastError = true)]
public static extern WindowStyles GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("Coredll.dll", SetLastError = true)]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, WindowStyles dwNewLong);

[Flags]
public enum WindowStyles : uint
{
WS_CHILD = 0x40000000,
WS_VISIBLE = 0x10000000,
WS_DISABLED = 0x08000000,
WS_GROUP = 0x00020000,
WS_TABSTOP = 0x00010000,
WS_OVERLAPPED = WS_BORDER | WS_CAPTION,
WS_CLIPSIBLINGS = 0x04000000,
WS_CLIPCHILDREN = 0x02000000,
WS_CAPTION = 0x00C00000, /* WS_BORDER | WS_DLGFRAME */
WS_BORDER = 0x00800000,
WS_DLGFRAME = 0x00400000,
WS_VSCROLL = 0x00200000,
WS_HSCROLL = 0x00100000,
WS_SYSMENU = 0x00080000,
WS_THICKFRAME = 0x00040000,
WS_MAXIMIZEBOX = 0x00020000,
WS_MINIMIZEBOX = 0x00010000,
WS_SIZEBOX = WS_THICKFRAME,
WS_POPUP = 0x80000000,
WS_EX_NOACTIVATE = 0x08000000,
WS_EX_DLGMODALFRAME = 0x00000001,
WS_EX_TOPMOST = 0x00000008,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_WINDOWEDGE = 0x00000100,
WS_EX_CLIENTEDGE = 0x00000200,
WS_EX_CONTEXTHELP = 0x00000400,
WS_EX_RIGHT = 0x00001000,
WS_EX_RTLREADING = 0x00002000,
WS_EX_LEFTSCROLLBAR = 0x00004000,
WS_EX_STATICEDGE = 0x00020000,
WS_EX_NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring
WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE),
WS_EX_CAPTIONOKBTN = 0x80000000,
WS_EX_NODRAG = 0x40000000,
WS_EX_ABOVESTARTUP = 0x20000000,
WS_EX_INK = 0x10000000,
WS_EX_NOANIMATION = 0x04000000
}
}

所以基本上,用你的代码做:

public MyForm()
{
DisableActivate();
Width = 100;
EnableActivate();
}

关于c# - OnActivated 在构造函数期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21932099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com