我正在将 Silverlight 应用程序转换为 WPF。下面的代码没有编译,但它在 Silverlight 中编译:
XAML:
<Grid x:Name="Table">
</Grid>
Run Code Online (Sandbox Code Playgroud)
后面的代码:
foreach (var uiElement in Table.Children
.Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
在Where它说
“UIElementCollection”不包含“Where”的定义,并且找不到接受“UIElementCollection”类型的第一个参数的扩展方法“Where”(您是否缺少 using 指令或程序集引用?)
System.Linq 添加了命名空间。
如果我转换UIElementCollection为 anIList<object>那么它可以工作,但我收到警告:
这是一个可疑的演员
我究竟做错了什么?
在 Silverlight 中,UIElementCollection实现了IEnumerable<T>,但UIElementCollection在 WPF 中实现了IEnumerable,而不是IEnumerable<T>。如果你想在这里使用 LINQ,你可以OfType<UIElement>()作为一个选项使用:
foreach (var uiElement in Table.Children.OfType<UIElement>()
.Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
问题是UIElementCollection没有实现泛型IEnumerable<T>:
public class UIElementCollection : IList, ICollection, IEnumerable
Run Code Online (Sandbox Code Playgroud)
虽然Enumerable.Where扩展方法需要通用版本:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource,?int,?bool> predicate
)
Run Code Online (Sandbox Code Playgroud)
因此,解决方案是首先投射元素:
foreach (var uiElement in Table.Children.OfType<UIElement>().Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2018 次 |
| 最近记录: |