Browse Source

WndHost is unreliable

pull/346/head
Nikita Tsukanov 11 years ago
parent
commit
40c559c41d
  1. 48
      src/Windows/Perspex.Designer/AppHost/WindowHost.cs
  2. 2
      src/Windows/Perspex.Designer/InProcDesigner/InProcDesignerView.xaml.cs
  3. 2
      src/Windows/Perspex.Designer/PerspexDesigner.xaml
  4. 32
      src/Windows/Perspex.Designer/PerspexDesigner.xaml.cs

48
src/Windows/Perspex.Designer/AppHost/WindowHost.cs

@ -11,13 +11,18 @@ namespace Perspex.Designer.AppHost
{ {
class WindowHost : UserControl class WindowHost : UserControl
{ {
public WindowHost() private readonly bool _supportScroll;
public WindowHost(bool supportScroll)
{ {
AutoScroll = true; _supportScroll = supportScroll;
VerticalScroll.Enabled = true; if (_supportScroll)
HorizontalScroll.Enabled = true; {
AutoScroll = true;
VerticalScroll.Enabled = true;
HorizontalScroll.Enabled = true;
}
SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Text = "ScrollableArea";
Controls.Add(_windowHost); Controls.Add(_windowHost);
_windowHost.Anchor = AnchorStyles.None; _windowHost.Anchor = AnchorStyles.None;
_timer.Tick += delegate _timer.Tick += delegate
@ -102,25 +107,36 @@ namespace Perspex.Designer.AppHost
{ {
if (_hWnd != IntPtr.Zero) if (_hWnd != IntPtr.Zero)
{ {
WinApi.RECT rc; if (_supportScroll)
WinApi.GetWindowRect(_hWnd, out rc); {
_desiredWidth = rc.Right - rc.Left; WinApi.RECT rc;
_desiredHeight = rc.Bottom - rc.Top; WinApi.GetWindowRect(_hWnd, out rc);
var pt = _windowHost.PointToClient(new Point(rc.Left, rc.Top)); _desiredWidth = rc.Right - rc.Left;
_desiredHeight = rc.Bottom - rc.Top;
var pt = _windowHost.PointToClient(new Point(rc.Left, rc.Top));
if (!(pt.Y == 0 && pt.X == 0 && _desiredWidth == _windowHost.Width && _desiredHeight == _windowHost.Height)) if (
!(pt.Y == 0 && pt.X == 0 && _desiredWidth == _windowHost.Width &&
_desiredHeight == _windowHost.Height))
{
_windowHost.Width = _desiredWidth;
_windowHost.Height = _desiredHeight;
WinApi.MoveWindow(_hWnd, 0, 0, _desiredWidth, _desiredHeight, true);
}
FixPosition();
}
else
{ {
_windowHost.Width = _desiredWidth; _windowHost.Width = Width;
_windowHost.Height = _desiredHeight; _windowHost.Height = Height;
WinApi.MoveWindow(_hWnd, 0, 0, _desiredWidth, _desiredHeight, true); WinApi.MoveWindow(_hWnd, 0, 0, Width, Height, true);
} }
FixPosition();
} }
} }
protected override void OnResize(EventArgs e) protected override void OnResize(EventArgs e)
{ {
FixPosition(); FixWindow();
base.OnResize(e); base.OnResize(e);
} }
} }

2
src/Windows/Perspex.Designer/InProcDesigner/InProcDesignerView.xaml.cs

@ -33,7 +33,7 @@ namespace Perspex.Designer.InProcDesigner
InitializeComponent(); InitializeComponent();
DataContext = _appModel; DataContext = _appModel;
_appModel.PropertyChanged += ModelPropertyChanged; _appModel.PropertyChanged += ModelPropertyChanged;
WindowHostControl.Child = _host = new WindowHost(); WindowHostControl.Child = _host = new WindowHost(true);
HandleVisibility(); HandleVisibility();
HandleWindow(); HandleWindow();

2
src/Windows/Perspex.Designer/PerspexDesigner.xaml

@ -6,7 +6,7 @@
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"> d:DesignHeight="300" d:DesignWidth="300">
<Grid> <Grid>
<ContentControl x:Name="NativeContainer" Panel.ZIndex="1"/> <WindowsFormsHost Background="White" x:Name="NativeContainer" Panel.ZIndex="1"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" Panel.ZIndex="0"> <ScrollViewer VerticalScrollBarVisibility="Auto" Panel.ZIndex="0">
<TextBox IsReadOnly="True" TextWrapping="WrapWithOverflow" x:Name="State"/> <TextBox IsReadOnly="True" TextWrapping="WrapWithOverflow" x:Name="State"/>
</ScrollViewer> </ScrollViewer>

32
src/Windows/Perspex.Designer/PerspexDesigner.xaml.cs

@ -73,41 +73,19 @@ namespace Perspex.Designer
{ {
if (e.PropertyName == nameof(ProcessHost.WindowHandle)) if (e.PropertyName == nameof(ProcessHost.WindowHandle))
{ {
if (NativeContainer.Content != null) if (NativeContainer.Child == null)
{ {
var wndHost = ((HwndHost) NativeContainer.Content); NativeContainer.Child = new WindowHost(false);
NativeContainer.Content = null;
wndHost?.Dispose();
} }
if (_host.WindowHandle != IntPtr.Zero)
{ {
var host = new NativeWindowHost(_host.WindowHandle); var wndHost = ((WindowHost) NativeContainer.Child);
NativeContainer.Content = host; wndHost.SetWindow(_host.WindowHandle);
} }
}
}
class NativeWindowHost :HwndHost
{
private readonly IntPtr _hWnd;
public NativeWindowHost(IntPtr hWnd)
{
_hWnd = hWnd;
}
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
WinApi.SetParent(_hWnd, hwndParent.Handle);
return new HandleRef(this, _hWnd);
}
protected override void DestroyWindowCore(HandleRef hwnd)
{
WinApi.SendMessage(hwnd.Handle, WinApi.WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
} }
} }
public void KillProcess() public void KillProcess()
{ {
_host.Kill(); _host.Kill();

Loading…
Cancel
Save