对于我的开源项目http://mytoolkit.codeplex.com,我试图为WinRT和WinPRT (8.1)实现一个改进的页面类。该类位于PCL库中。这就是为什么我必须通过反射注册回按事件。没有反射的代码如下所示:
using Windows.Phone.UI.Input;
namespace SampleUniversalPhoneApp
{
public class MyClass
{
public void Start()
{
HardwareButtons.BackPressed += OnBackPressed;
}
public void Stop()
{
HardwareButtons.BackPressed -= OnBackPressed;
}
private void OnBackPressed(object sender, BackPressedEventArgs e)
{
// TODO: Add more code
e.Handled = true;
}
}}
现在,我需要完全相同的逻辑,但需要反射,因为HardwareButtons和BackPressedEventArgs类在我的PCL库中不可用。
我怎么能这么做?
发布于 2014-04-22 17:10:36
以下是这个问题的解决方案:
public class MyClass
{
private object _backPressedToken;
private static readonly Type _hardwareButtonsType;
private static readonly EventInfo _backPressedEvent;
static MyClass()
{
_hardwareButtonsType = Type.GetType(
"Windows.Phone.UI.Input.HardwareButtons, " +
"Windows, Version=255.255.255.255, Culture=neutral, " +
"PublicKeyToken=null, ContentType=WindowsRuntime");
if (_hardwareButtonsType != null)
_backPressedEvent = _hardwareButtonsType.GetRuntimeEvent("BackPressed");
}
public void Start()
{
// Register event
Action<object, object> callback = OnBackKeyPressed;
var callbackMethodInfo = callback.GetMethodInfo();
var backPressedDelegate = callbackMethodInfo.CreateDelegate(_backPressedEvent.EventHandlerType, this);
_backPressedToken = _backPressedEvent.AddMethod.Invoke(null, new object[] { backPressedDelegate });
}
public void Stop()
{
// Unregister event
_backPressedEvent.RemoveMethod.Invoke(null, new [] { _backPressedToken });
_backPressedToken = null;
}
private void OnBackKeyPressed(object sender, dynamic args)
{
// Handle event
if (!args.Handled)
args.Handled = DoIt(args.Handled);
}
}最后在这个类中使用:
发布于 2014-04-22 08:48:52
PCL库用于手机、平板电脑或计算机应用程序,这就是为什么您找不到任何特定于UI的类。
因此,这将是您库的客户端管理这些UI特定机制的工作。
我不认为使用反射是个好主意;如果你开始使用它,你最终会得到一个充满反射代码的库,很难维护,很难理解。
IMHO,您应该改变您的架构,给库的客户端提供更多的权力。
顺便提一句,微软将很快发布一个新的VS2013更新(已经作为测试版提供),允许您为所有基于微软的设备开发一个独特的应用程序。
https://stackoverflow.com/questions/23213097
复制相似问题