Silverlight можно использовать в WinForms-приложении не только для вывода Xaml. Также можно перехватывать сообщения, которые создаются в Silverlight.
За основу возьмем пример из сообщения "
Silverlight в WinForms". Добавим в него неполное определение интерфейса IXcpControl (интерфейс наследует IDispatch, поэтому необязательно импортировать все свойства и методы):
[ComImport, Guid("1FB839CC-116C-4C9B-AE8E-3DBB6496E326"), |
InterfaceType(ComInterfaceType.InterfaceIsIDispatch), ComVisible(true)] |
public interface IXcpControl |
| string Source { get; set; } |
| object OnLoad { get; set; } |
И добавим наследника IReflect (используется в качестве посредника между Silverlight и WinForms; также можно использовать вместе с JavaScript):
public class Handler : IReflect |
| public EventHandler _EventHandler; |
| public Handler(EventHandler eh) |
| if (_EventHandler != null) |
| _EventHandler(this, EventArgs.Empty); |
| object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters) |
| if (name.Equals("[DISPID=0]", StringComparison.OrdinalIgnoreCase)) |
| throw new MissingMethodException(base.GetType().Name, name); |
| PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) { return new PropertyInfo[0]; } |
| MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr) { return new MethodInfo[0]; } |
| FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr) { return new FieldInfo[0]; } |
| MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) { return new MemberInfo[0]; } |
| MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) { return null; } |
| FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr) { return null; } |
| MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr) { return null; } |
| MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr) { return null; } |
| PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { return null; } |
| PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr) { return null; } |
| Type IReflect.UnderlyingSystemType { get { return null; } } |
Теперь надо создать форму и в ее конструктор поместить следующий код:
this.Size = new Size((int)(SystemInformation.WorkingArea.Width * .50f), 400); |
| <SCRIPT id='_Xaml' type='text/xaml'> |
| <?xml version='1.0' encoding='utf-8' ?> |
| xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' |
| xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'> |
| <TextBlock FontSize='40' Foreground='Red'>Hello, World!</TextBlock> |
| <OBJECT ID='_Ag' data='data:application/x-silverlight,' type='application/x-silverlight' Width='100%' Height='100%'> |
| <PARAM NAME='Background' VALUE='#FFFADF' /> |
WebBrowser wb = new WebBrowser(); |
wb.DocumentCompleted += delegate |
| var ag = wb.Document.GetElementById("_Ag").DomElement as IXcpControl; |
| ag.OnLoad = new Handler(delegate { MessageBox.Show("Done!"); }); |
wb.Dock = DockStyle.Fill; |
WebBrowser загрузит html и вызовет обработчик события DocumentCompleted. К событию OnLoad будет подключен обработчик, который вызовется из Silverlight после завершения загрузки xaml.
Комментариев нет:
Отправить комментарий