Как я могу вызвать метод.Invoke для Delegate.Target?
Учитывая следующий метод:
public static void ExecuteAsync( this EventHandler eH, object sender, EventArgs eA ) {
eH.GetInvocationList( ).Cast<EventHandler>( ).ToList( ).ForEach( e => {
e.BeginInvoke( sender, eA, IAR =>
( ( IAR as AsyncResult ).AsyncDelegate as EventHandler ).EndInvoke( IAR ), null );
} );
}
Я заметил, что e
имеет свойство Target.
Когда я смотрел дальше, я обнаружил, что могу проверить, e.Target is System.Windows.Controls.Control
или же e.Target is System.Windows.Forms.Control
,
Это замечательно, потому что в случае использования этого расширения для удобства (а я ленивый) я хочу быть в состоянии сказать, нужно ли цели делегата вызывать делегат или нет (В случае WinForms: Control.Invoke( foo )
; В случае WPF: Control.Dispatcher.Invoke( foo )
).
Мне не нужно знать, как привести объект к его фактическому типу (я могу жить без этого): мне просто нужно знать, как я могу привести объект таким образом, чтобы я мог получить доступ к InvokeRequired
собственность и Invoke
методы (в случае элемента управления WinForms) или Dispatcher
собственность (для доступа к Dispatcher.CheckAccess( )
функция и Dispatcher.Invoke( )
метод).
Это возможно? Как я могу сделать это? (Я пробовал кастовать e.Target to System.Windows.Control.Control
но результат не имеет Dispatcher
имущество).
РЕДАКТИРОВАТЬ
Согласно запросу на код кастинга (и импорт / ссылки):
Чтобы определить, является ли это элементом управления WPF:
( if e.Target is System.Windows.Controls.Control ){ //Fully Qualified
( e.Target as System.Windows.Controls.Control)./*...*/;
}
Чтобы определить, является ли это элементом управления WinForms:
( if e.Target is System.Windows.Forms.Control ){ //Fully Qualified
( e.Target as System.Windows.Forms.Control )./*...*/;
}
Проект ссылается на несколько библиотек:
Microsoft.CSharp
MySql.Data
PresentationFramework
System
System.Configuration
System.Configuration.Install
System.Core
System.Data
System.Data.DataSetExtensions
System.Drawing
System.Management
System.Windows.Forms
System.Xml
System.Xml.Linq
1 ответ
Разве это не работает для вас. Это не самый элегантный способ, но он проверяет, является ли целью элемент управления WPF или WinForms:
if (e.Target is System.Windows.Controls.Control)
{
var wpfTarget = ((System.Windows.Controls.Control)e.Target);
if (wpfTarget.Dispatcher.CheckAccess()) // check if on dispatcher thread
{
wpfTarget.Dispatcher.Invoke(/*...*/);
}
}
else if (e.Target is System.Windows.Forms.Control)
{
var formsTarget = (System.Windows.Forms.Control)e.Target;
if (formsTarget.InvokeRequired)
{
formsTarget.Invoke(/*...*/);
}
}
В VisualStudio у меня есть поддержка Intelisense для Dispatcher
на wpfTarget
:
РЕДАКТИРОВАТЬ
Ниже ссылки, которые я включил
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
из которых только четыре используются:
using System;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Windows;