在我的winforms应用程序中,我试图获得一个主窗口句柄,所以我可以将它设置为我的wpf模式窗口的父级.我对winforms没有太多的经验,所以经过一些谷歌搜索我找到了两种方法来获得它.
System.Windows.Forms.Application.OpenForms[0].Handle
Run Code Online (Sandbox Code Playgroud)System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle
Run Code Online (Sandbox Code Playgroud)(1)似乎总是返回看似正确的相同值(至少我的模态窗口表现得如预期的那样),而(2)有时返回与(1)相同的值,但有时 - 一个完全不同的指针,似乎不起作用(我的模态窗口出现在每个其他窗口的顶部,而不仅仅是父窗口).
有人可以解释这两种方法的区别吗?有时它们会返回不同的结果,这是正常的吗?
编辑:
万一其他人想知道:一旦你得到句柄,你可以通过创建WindowInteropHelper类来使用它:
public static void SetInteropParent(this Window wpfDialogWindow, IntPtr winformsParentHandle)
{
new WindowInteropHelper(wpdDialogWindow) { Owner = winformsParentHandle };
}
Run Code Online (Sandbox Code Playgroud) 由于我原来的问题有点过于模糊,让我澄清一下.
我的目标是:
我想知道的是什么:
我在 SO 上发现了有关此问题的多个问题,但是我仍然无法完全获得可靠的解决方案。这是我阅读答案后得出的结论。
XML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="300" Width="300" x:Name="this">
<TabControl IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Tabs, ElementName=this}" x:Name="TabControl"/>
</Window>
Run Code Online (Sandbox Code Playgroud)
背后代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var tabs = new ObservableCollection<string> {"Tab1", "Tab2", "Tab3"};
Tabs = CollectionViewSource.GetDefaultView(tabs);
Tabs.CurrentChanging += OnCurrentChanging;
Tabs.CurrentChanged += OnCurrentChanged;
Tabs.MoveCurrentToFirst();
CurrentTab = tabs.First();
}
private void OnCurrentChanging(object sender, CurrentChangingEventArgs e)
{
//only show message box when tab is changed by user input
if (!_cancelTabChange)
{
if (MessageBox.Show("Change tab?", "Message", MessageBoxButton.YesNo) == …Run Code Online (Sandbox Code Playgroud) 所以,我试图围绕微软的Dataflow库.我构建了一个非常简单的管道,只包含两个块:
var start = new TransformBlock<Foo, Bar>();
var end = new ActionBlock<Bar>();
start.LinkTo(end);
Run Code Online (Sandbox Code Playgroud)
现在我可以Foo通过调用异步处理实例:
start.SendAsync(new Foo());
Run Code Online (Sandbox Code Playgroud)
我不明白的是如何在需要时同步进行处理.我认为等待就SendAsync足够了:
start.SendAsync(new Foo()).Wait();
Run Code Online (Sandbox Code Playgroud)
但显然,只要项目被管道中的第一个处理器接受,它就会返回,而不是当项目被完全处理时.那么有没有办法等到last(end)块处理给定项目?除了WaitHandle通过整个管道.