WPF Dialog 를 WinForm Dialog 로 전환 할 때 주의해 야 할 문제 계속
//==============================================================================
// File Name : WpfModalDialogFixer.cs
//
// Copyright (C) 2010 GrapeCity Inc. All rights reserved.
//
// Distributable under LGPL license.
//
//==============================================================================
//
//
// This file defines the class WpfModalDialogFixer for solve the problem as below:
// When showing a modal dialog which ShowTaskBar is false, first deactive the application the activate it again.
// The modal dialog would be at behind of MainWindow.
//
//
//
//
//
//
//
//
//
// Create the file and define the class.
//
//
using System;
using System.Threading;
using System.Windows;
using System.Windows.Interop;
using System.Runtime.InteropServices;
namespace GrapeCity.Windows
{
///
/// Represents the class.
///
public class WpfModalDialogFixer
{
[ThreadStatic]
private static WpfModalDialogFixer _fixer;
private static readonly object _rootSync = new object();
static WpfModalDialogFixer()
{
ComponentDispatcher.EnterThreadModal += new EventHandler(OnComponentDispatcherEnterThreadModal);
ComponentDispatcher.LeaveThreadModal += new EventHandler(OnComponentDispatcherLeaveThreadModal);
}
private WpfModalDialogFixer()
{
}
static void OnComponentDispatcherLeaveThreadModal(object sender, EventArgs e)
{
if (WpfModalDialogFixer.Current.Enable)
{
HwndSource src = HwndSource.FromVisual(Application.Current.MainWindow) as HwndSource;
if (src != null)
{
src.RemoveHook(new HwndSourceHook(OnComponentDispatcherThreadPreprocessMessage));
}
}
}
static IntPtr OnComponentDispatcherThreadPreprocessMessage(IntPtr hwnd, int message, IntPtr wparam, IntPtr lparam, ref bool handled)
{
// Need take care the message: WM_SETFOCUS, and if now in Modal dialog mode.
if (message == 0x7 && ComponentDispatcher.IsThreadModal)
{
bool actived = false;
foreach (Window w in Application.Current.Windows)
{
HwndSource src = HwndSource.FromVisual(w) as HwndSource;
if (src != null /*&& src.Handle != hwnd*/)
{
if (IsWindowEnabled(src.Handle))
{
w.Activate();
actived = true;
break;
}
}
}
if (!actived) // in this case, caused by MessageBox.Show(...)
{
//TODO: how to handle?
}
handled = true; // set handled to prevent default implement.
}
return IntPtr.Zero;
}
static void OnComponentDispatcherEnterThreadModal(object sender, EventArgs e)
{
if (WpfModalDialogFixer.Current.Enable)
{
HwndSource src = HwndSource.FromVisual(Application.Current.MainWindow) as HwndSource;
if (src != null)
{
src.AddHook(new HwndSourceHook(OnComponentDispatcherThreadPreprocessMessage));
}
}
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindowEnabled(IntPtr hwnd);
public static WpfModalDialogFixer Current
{
get
{
if (_fixer == null)
{
lock (_rootSync)
{
if (_fixer == null)
{
_fixer = new WpfModalDialogFixer();
}
}
}
return _fixer;
}
}
public bool Enable
{
get;
set;
}
}
}
다음으로 전송:https://www.cnblogs.com/powertoolsteam/archive/2010/10/26/1861494.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.