c# - 具有动态编程的 FrameworkElement 和 FrameworkContentElement 的通用接口(interface)

标签 c# wpf dynamic frameworkelement

我试着简而言之:FrameworkElement 和 FrameworkContentElement 共享许多相同的 API,但没有通用的接口(interface)。只有 DependencyObject 作为基类。

我遇到了 this implementation of IFrameworkElement ,它手动添加一个接口(interface)和两个包装器类。现在这段代码是在 .NET 3.5 中实现的,作者评论说在 .NET 4 中使用动态编程会容易得多:

The actual code is very simple, but about 624 lines long for each element. (It will be a much simpler one line implementation in a dynamic language - C# 4.0 is coming :) ).

我很好奇它的实现会是什么样子。我假设它会归结为 IFrameworkElement 的动态实现,并阅读有关 ExpandoObjectDynamicObject 的内容,看看我是否可以自己实现,但我我有点难过。我想可以编写 DynamicObject 的自定义实现 - 但这不是单行代码。这真的可以通过动态规划变得那么容易吗?我什至不需要成为一个类轮,我可以使用 10 甚至 100 行而不是原来的 1250 行。

我是这样想的:

// Example, not working:
public IFrameworkElement AsFrameworkElement(FrameworkElement ele)
{
  dynamic ife = ele as IFrameworkElement;
  return ife;    
}

IFrameworkElement frameworkElement = AsFrameworkElement(new Button());
frameworkElement.DataContext = "Whatever";

IFrameworkElement frameworkContentElement = AsFrameworkElement(new Paragraph());
frameworkContentElement.DataContext = "Whatever again";

最佳答案

看博客原代码:

var dataContect = "DataContext";
var frameworkElement = sender as FrameworkElement;
if ( frameworkElement != null )
{
    frameworkElement.DataContext = dataContect;
}
else
{
    var frameworkContentElement = sender as FrameworkContentElement;
    if ( frameworkContentElement != null )
    {
        frameworkContentElement.DataContext = dataContect;
    }
}

会变成

var dataContext = "DataContext"
dynamic element = sender;
element.DataContext = dataContext;

已经是这样了。在运行时,将通过反射搜索名称为 DataContext 的属性(注意:当涉及到动态类型列表时,速度可能会非常慢),然后调用它。

注意:如果该属性不存在,将抛出 RuntimeBinderException。您可以在最后一行周围添加一些 try...catch。

关于c# - 具有动态编程的 FrameworkElement 和 FrameworkContentElement 的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38790610/

相关文章:

c# - 如何从列表框中选择的项目中获取特定属性

c# - 如何防止 ListView 扩展窗口维度?

html - Dojo dijit 动态添加 Div 按钮

css - 是否可以仅使用 CSS 更改修改后的输入字段的样式?

dynamic - 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

c# - 尝试将 SqlDataAdapter 中的 SqlCommand 作为参数传递

c# - 如何为可为空的 bool 值读取 null

C#、HTTPClient - IfMatch 格式要求?

c# - 无法加载文件 Newtonsoft Json

c# - 包含 UserControl 的项目的 Dotnet 构建失败(当前上下文中不存在 InitializeComponent)