Wpf 将ViewModelBase移动到可移植类库
我正在尝试使用可移植类库来为我自己的MVVM框架减少每个平台的程序集 所以我现在有了这段代码(灵感来自@lbugnion MVVMLight) #如果银光Wpf 将ViewModelBase移动到可移植类库,wpf,portable-class-library,Wpf,Portable Class Library,我正在尝试使用可移植类库来为我自己的MVVM框架减少每个平台的程序集 所以我现在有了这段代码(灵感来自@lbugnion MVVMLight) #如果银光 _isInDesignMode = DesignerProperties.IsInDesignTool; #否则 #恩迪夫 但当我试图在PCL中使用它时,它无法识别DesignerProperty和FrameworkElement等。 我应该如何克服这个问题 谢谢 您可以像我在MVVM Lig
_isInDesignMode = DesignerProperties.IsInDesignTool;
#否则
#恩迪夫
但当我试图在PCL中使用它时,它无法识别DesignerProperty和FrameworkElement等。
我应该如何克服这个问题
谢谢 您可以像我在MVVM Light PCL fork中一样执行此操作:
使用反射加载和调用适当的调用。我认为您不应该将此代码直接包含在PCL中。pcl的路线图看起来不错,但我怀疑FrameworkElement在短期内是否可以移植 要么:
- 删除此设计时代码
- 或者将此代码抽象出来,以便通过特定于平台的接口调用它。请参阅msdn上的平台抽象技术-
- 或者使用@Oren答案中的反射技术
如果您必须使用一些特定于平台的调用,那么使用依赖项注入和IoC来隐藏实际的实现,并在PCL中仅使用接口类型,这应该可以正常工作。在我看来,这是少数几个使用反射从PCL调用特定于平台的代码的情况之一。您只需要知道您是否正在设计器中运行。不幸的是,对于XAML UI堆栈的不同变体,这是以不同的方式公开的。如果这是您唯一需要的特定于平台的东西,那么可能不值得为每个平台创建特定于平台的库,并让用户引用额外的库来避免在PCL中使用这种类型的反射代码/cc@MartinSuchan
_isInDesignMode = DesignerProperties.IsInDesignTool;
var prop = DesignerProperties.IsInDesignModeProperty;
_isInDesignMode
= (bool)DependencyPropertyDescriptor
.FromProperty(prop, typeof(FrameworkElement))
.Metadata.DefaultValue;
// Just to be sure
if (!_isInDesignMode.Value
&& Process.GetCurrentProcess().ProcessName.StartsWith("devenv", StringComparison.Ordinal))
{
_isInDesignMode = true;
}
}
return _isInDesignMode.Value;
}
}
}