我在MSDN上找到了一个线程,它显示了如何将项添加到winform标题栏的上下文菜单中.不幸的是,它没有显示如何使用自定义菜单项注册事件,我一直无法弄清楚如何做到这一点.下面是一个示例应用程序,可以将其复制并粘贴到新的Windows窗体应用程序中.如果有人可以为我完成样品,我将不胜感激.谢谢
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
IntPtr hMenu = GetSystemMenu(Handle, false);
if (hMenu != IntPtr.Zero)
{
var menuInfo = new MENUITEMINFO
{
cbSize = (uint) Marshal.SizeOf(typeof (MENUITEMINFO)),
cch = 255,
dwTypeData = "Test Item",
fMask = 0x1 | 0x2 | 0x10,
fState = 0,
fType = 0x0
};
InsertMenuItem(hMenu, 0, true, ref menuInfo);
DrawMenuBar(Handle);
}
}
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool …Run Code Online (Sandbox Code Playgroud) 有没有办法在WPF表单中的某种容器或包装器类型控件中托管/显示完整的WinForms表单(而不仅仅是单个控件)?我正在寻找类似于概念的东西来自虚拟包含来自php或iframe的html.可能通过将其编译为OCX或DLL.
我们有一个WinForms应用程序,我们正在逐步转换为WPF.此时应用程序的主窗体是一个Form(WinForms),它包含一个用WPF构建的垂直侧边栏.侧栏托管在ElementHost控件中.
侧边栏由包含其他控件的ScrollViewer组成.问题是,当焦点位于WinForms aera中的某个位置并且我在ScrollViewer上使用鼠标滚轮时,它不会滚动.
这与WPF/WinForms集成有关,因为在100%WPF项目中,即使焦点在另一个控件上,ScrollViewer也会对鼠标滚轮作出反应.
解决这个问题的正确方法是什么?
我有一个 WPF 应用程序,其主窗口上具有以下 KeyBinding:
<KeyBinding Command="Commands:EditCommands.Undo" Gesture="CTRL+Z" />
<KeyBinding Command="Commands:EditCommands.Redo" Gesture="CTRL+Y" />
Run Code Online (Sandbox Code Playgroud)
这使得命令可以很好地响应快捷方式。但是,在所有嵌入 WinForms 文本框或富文本框的地方,我都无法使用这些快捷方式。如果我删除上述绑定,WinForms 快捷方式可以正常工作。
如何在 WinForms 和 WPF 中支持这些快捷方式?我更喜欢通用方法,因为这个问题可能会影响具有相同键绑定的许多其他命令。
好吧,我不确定我是否理解这应该如何工作,但在我的应用程序中,我将一个关键手势(Ctrl + K)绑定到RoutedCommand.无论我在哪里专注于我的应用程序,键组合都有效,除非我在包含Web浏览器控件的WindowsFormsHost中使用它.我尝试捕获Web浏览器控件的PreviewKeyDown事件并将IsInputKey设置为false.理论上,这应该导致主持人考虑未经处理的关键手势并将其向上发送,但这不会发生.
更新:
如果我覆盖控件的bool IsInputKey(Keys keyData)并返回false,它将起作用并且命令将按原样执行.
也许我处理PreviewKeyDown的方式有问题?
private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)
{
e.IsInputKey = false;
}
Run Code Online (Sandbox Code Playgroud)
我希望这能让我从主窗口中捕获任何组合键.我宁愿通过事件处理来解决这个问题而不是扩展控件......
我有一个WPF应用程序,托管一个无模式的Win32表单.一切都顺利进行,直到我将VNC连接或拆卸到机器上.然后应用程序死锁:它不再重绘任何东西,不会对用户交互作出反应.我使用WinDbg查看了堆栈跟踪:
0012f03c 792b6865 System.Threading.WaitHandle.WaitOne(Int32, Boolean)
0012f050 7b6f1a4f System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)
0012f064 7ba2d68b System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
0012f104 7b6f33ac System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])
0012f138 7b920bd7 System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback, System.Object)
0012f150 7a92ed62 Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(Boolean, System.Object[])
0012f184 7a92dc8f Microsoft.Win32.SystemEvents.RaiseEvent(Boolean, System.Object, System.Object[])
0012f1d0 7a92daec Microsoft.Win32.SystemEvents.OnDisplaySettingsChanging()
0012f1e0 7a574c9f Microsoft.Win32.SystemEvents.WindowProc(IntPtr, Int32, IntPtr, IntPtr)
0012f1e4 003c20dc [InlinedCallFrame: 0012f1e4]
0012f3a8 57843a57 System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
0012f3f8 57843129 System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
0012f404 578430cc System.Windows.Threading.Dispatcher.Run()
0012f410 55bed46e System.Windows.Application.RunDispatcher(System.Object)
0012f41c 55bec76f System.Windows.Application.RunInternal(System.Windows.Window)
0012f440 55bd3aa6 System.Windows.Application.Run(System.Windows.Window)
0012f450 55bd3a69 System.Windows.Application.Run()
Run Code Online (Sandbox Code Playgroud)
显然,VNC附加/分离引发一个OnDisplaySettingsChanging事件,该事件又试图使用一个事件来调用某个事件System.Windows.Forms.Control.Invoke,该事件向主线程发送一条消息然后等待响应.但由于这一切都发生在主线程中,消息循环永远不会得到消息,等待永远不会返回.
我找到了一个使用的解决方法EnableSystemEventsThreadAffinityCompatibility(基本上绕过了Control.Invoke调用),但感觉就像一个肮脏的黑客.
有人见过这样的事吗?
有人知道为什么当消息到达主(STA)线程时,SystemEvents类会使用Control.Invoke …
我正在咨询一个大型.Net winforms项目,该项目必须能够以"触摸"模式运行,因此可以使用触摸屏界面进行操作.应用程序架构已经包含扩展逻辑,用于放大标准.Net表单和控件上的字体/显示,自定义控件也可以处理缩放.
问题是应用程序使用OpenFileDialog和SaveFileDialog,它不能使用相同的逻辑进行扩展(这实际上是在递归地调整控件和表单上Font属性的大小).我相信这些对话框本质上是本机Windows对话框,而OpenFileDialog类实际上只是包装类,它们公开了一个标准的.Net接口来与它们进行交互.
一种解决方案可能是为这些事情实现自定义对话框,但这可能是一些广泛的工作.我们真正想做的是以某种方式缩放这个特定对话框的字体大小(可能通过一些P/Invoke窗口处理魔术)?
我知道触摸启用的一个解决方案通常是调整Windows的字体大小,但是这个想法并没有真正吸引这家公司,他们宁愿扩展应用程序本身并使其余的操作系统不受影响.
那么,关于如何将这些对话框扩展为更大的字体的任何经验或想法?或者我们应该咬紧牙关并为此创建自定义对话框?
.net openfiledialog winforms-interop savefiledialog winforms
我有以下场景(我已将其剥离为示例应用程序):
WindowsFormsHostform1.Show(this).问题是:
.Owner属性为null.
.Owner属性的一些工作已经完成,这意味着我不能忽略这个问题.当然,理想情况下,这里没有任何依赖性..Owner属性设置正确.我能理解为什么这里有问题,但我希望我的下一个问题的答案可能是'是'!
有什么方法可以通过在等式的WPF方面进行更改来实现这一点吗?
如果不这样做,可以在WinForms方面做任何事情吗?(这可能超出了我可以在那里实现一些变化的可能性......)
这是我的示例应用程序中的代码.首先是WPF方面:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="700">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Name="btnAdd" Click="btnAdd_Click" Content="Add Winform"/>
<WindowsFormsHost Grid.Row="1" Name="host" ScrollViewer.CanContentScroll="False"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
public partial class MainWindow : Window
{
private WindowsFormsHost host;
public MainWindow()
{
InitializeComponent(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建 WPF GUI 应用程序来托管已经存在的 QT GUI 应用程序作为主 UI 的一部分。
QT 应用程序不需要处理鼠标/键盘输入。
我已经尝试过这个SO Post 中提到的方法。似乎所有这些方法都不适用于 QT 应用程序。
是否可以直接在 VB6 窗体中使用 .NET Windows 窗体控件?
这里的目标是在旧版 VB6 应用程序中使用更新的 .NET 控件。我们已经有了一个混合的 .NET / VB6 环境。
我知道Microsoft InteropForms Toolkit,但它被描述为用于将自定义用户控件从 .NET 导出到 VB6。这似乎没有提供预先存在的控件(但我可能是错的)。
我试图在 VB6 项目中简单地引用 System.Windows.Forms.tlb 作为组件库 - 但它不允许选择它,这似乎意味着它内部没有 ActiveX 控件。
我知道您可以轻松地执行相反的操作 - 例如,在 .NET winforms 表单上使用 VB6 用户控件。那不是我需要的。
您可以System.Windows.Forms从 VB6 以正常方式引用该程序集,并在 VBP 中得到如下行:
Reference=*\G{215D64D2-031C-33C7-96E3-61794CD1EE61}#2.4#0#C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Windows.Forms.tlb#System_Windows_Forms
Run Code Online (Sandbox Code Playgroud)
但这不提供在表单上放置控件的访问权限。