5 // Moonlight List (moonlight-list@lists.ximian.com)
7 // Copyright 2008 Novell, Inc.
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Collections
.Generic
;
32 using System
.Windows
.Markup
;
33 using System
.Windows
.Media
;
34 using System
.Windows
.Input
;
36 namespace System
.Windows
.Controls
.Primitives
{
38 public sealed partial class Popup
: FrameworkElement
40 static UnmanagedEventHandler on_opened
= Events
.SafeDispatcher (
41 (IntPtr target
, IntPtr calldata
, IntPtr closure
) =>
42 ((Popup
) NativeDependencyObjectHelper
.FromIntPtr (closure
)).OnOpened ());
46 Events
.AddOnEventHandler (this, EventIds
.Popup_OpenedEvent
, on_opened
);
49 internal event EventHandler ClickedOutside
;
51 internal UIElement RealChild
{
53 if (_clickCatcher
!= null) {
54 Canvas root
= Child
as Canvas
;
55 return root
.Children
[1];
63 private void OnOpened ()
67 NativeMethods
.event_object_do_emit_current_context (native
, EventIds
.Popup_OpenedEvent
, IntPtr
.Zero
);
72 internal void CatchClickedOutside ()
77 void RearrangePopup ()
82 UIElement child
= Child
;
83 Canvas root
= new Canvas ();
84 _clickCatcher
= new Canvas { Background = new SolidColorBrush (Colors.Transparent) }
;
86 root
.Children
.Add (_clickCatcher
);
87 root
.Children
.Add (child
);
91 _clickCatcher
.MouseLeftButtonDown
+= delegate(object sender
, MouseButtonEventArgs e
) {
92 EventHandler h
= ClickedOutside
;
94 h (this, EventArgs
.Empty
);
100 if (_clickCatcher
== null)
104 GeneralTransform xform
= Application
.Current
.RootVisual
.TransformToVisual (this);
106 _clickCatcher
.RenderTransform
= (Transform
)xform
;
107 } catch (ArgumentException
) {
108 // Drop errors looking up the transform
111 Canvas
.SetTop (_clickCatcher
, -VerticalOffset
);
112 Canvas
.SetLeft (_clickCatcher
, -HorizontalOffset
);
113 _clickCatcher
.Height
= Application
.Current
.Host
.Content
.ActualHeight
;
114 _clickCatcher
.Width
= Application
.Current
.Host
.Content
.ActualWidth
;