デフォルトのWPFの動作は、WPFコントロールをレンダリングしてから、WinFormsを上にレンダリングすることですが、上にWPFをレンダリングする方法はありますWindowsFormsHost
か?
編集:私も一時的なハックを見つけました。wpfコントロールがオーバーラップする場合WindowsFormsHost
、サイズを変更しますWindowsFormsHost
(これは、オーバーラップする長方形のオブジェクトがある場合にのみ機能し、他の形状では機能しません)。
デフォルトのWPFの動作は、WPFコントロールをレンダリングしてから、WinFormsを上にレンダリングすることですが、上にWPFをレンダリングする方法はありますWindowsFormsHost
か?
編集:私も一時的なハックを見つけました。wpfコントロールがオーバーラップする場合WindowsFormsHost
、サイズを変更しますWindowsFormsHost
(これは、オーバーラップする長方形のオブジェクトがある場合にのみ機能し、他の形状では機能しません)。
パーティーに遅れましたが、最近、WebBrowser コントロールを使用してこの問題に遭遇しました。
最後の修正は、モーダル ダイアログを上部にホストするたびに、Web ブラウザーのスクリーンショットを作成することでした。これは少し面倒だったので、Github プロジェクトに変えました。これが少し役立つことを願っています -
https://github.com/chris84948/AirspaceFixer
(AirspaceFixerの下のNugetにもあります)
プロジェクトを作成したら、あとはこれだけです
xmlns:asf="clr-namespace:AirspaceFixer;assembly=AirspaceFixer"
<asf:AirspacePanel FixAirspace="{Binding FixAirspace}">
<WebBrowser x:Name="Browser" />
</asf:AirspacePanel>
FixAirspace
コンテンツの「実際の」ビューからスクリーンショットまたは「偽の」ビューに切り替える依存関係プロパティはどこにありますか。
これを試着してサイズを確認してください:
<hacks:AirspaceOverlay>
<hacks:AirspaceOverlay.OverlayChild>
<Canvas ToolTip = "A tooltip over a DirectX surface" Background="#01000000" Name="Overlay" />
</hacks:AirspaceOverlay.OverlayChild>
<controls:OpenGLControlWrappingWindowsFormsHost />
</hacks:AirspaceOverlay>
// Adapted from http://blogs.msdn.com/b/pantal/archive/2007/07/31/managed-directx-interop-with-wpf-part-2.aspx & http://www.4mghc.com/topics/69774/1/in-wpf-how-can-you-draw-a-line-over-a-windowsformshost
public class AirspaceOverlay : Decorator
{
private readonly Window _transparentInputWindow;
private Window _parentWindow;
public AirspaceOverlay()
{
_transparentInputWindow = CreateTransparentWindow();
_transparentInputWindow.PreviewMouseDown += TransparentInputWindow_PreviewMouseDown;
}
public object OverlayChild
{
get { return _transparentInputWindow.Content; }
set { _transparentInputWindow.Content = value; }
}
private static Window CreateTransparentWindow()
{
var transparentInputWindow = new Window();
//Make the window itself transparent, with no style.
transparentInputWindow.Background = Brushes.Transparent;
transparentInputWindow.AllowsTransparency = true;
transparentInputWindow.WindowStyle = WindowStyle.None;
//Hide from taskbar until it becomes a child
transparentInputWindow.ShowInTaskbar = false;
//HACK: This window and it's child controls should never have focus, as window styling of an invisible window
//will confuse user.
transparentInputWindow.Focusable = false;
return transparentInputWindow;
}
void TransparentInputWindow_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
_parentWindow.Focus();
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
UpdateOverlaySize();
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
if (_transparentInputWindow.Visibility != Visibility.Visible)
{
UpdateOverlaySize();
_transparentInputWindow.Show();
_parentWindow = GetParentWindow(this);
_transparentInputWindow.Owner = _parentWindow;
_parentWindow.LocationChanged += ParentWindow_LocationChanged;
_parentWindow.SizeChanged += ParentWindow_SizeChanged;
}
}
private static Window GetParentWindow(DependencyObject o)
{
var parent = VisualTreeHelper.GetParent(o);
if (parent != null)
return GetParentWindow(parent);
var fe = o as FrameworkElement;
if (fe is Window)
return fe as Window;
if (fe != null && fe.Parent != null)
return GetParentWindow(fe.Parent);
throw new ApplicationException("A window parent could not be found for " + o);
}
private void ParentWindow_LocationChanged(object sender, EventArgs e)
{
UpdateOverlaySize();
}
private void ParentWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
UpdateOverlaySize();
}
private void UpdateOverlaySize()
{
var hostTopLeft = PointToScreen(new Point(0, 0));
_transparentInputWindow.Left = hostTopLeft.X;
_transparentInputWindow.Top = hostTopLeft.Y;
_transparentInputWindow.Width = ActualWidth;
_transparentInputWindow.Height = ActualHeight;
}
}
この「空域」の問題は、WPF vNextで修正される予定です。here、here、 hereなど、いくつかのソリューションがあります。
これを行う 1 つの方法は、Interop コンテンツをオーバーレイする透明なポップアップまたはウィンドウで WPF コンテンツをホストすることです。
この件に関してこれまでに見た最良の回答へのリンクは次のとおりです 。WPFウィンドウを別のウィンドウの上に重ねることはできますか?
ハッキングに満足できない人がいる場合は、WindowsFormsHost の Visibility を Collapsed または Hidden に設定することが常にオプションです。