VB.Net:wpf窗口的集合

时间:2013-03-21 18:49:35

标签: wpf vb.net wpf-controls

我是VB.Net的新手。

我正在编写类似于调查的程序。 WPF窗口按顺序依次弹出问题。现在,我的客户要求为一些窗口随机化订单。我想我可能有一个窗口集合,并按随机顺序呈现这些窗口。但是,我没有找到任何相关信息。

有人可以向我展示如何在某种集合中存储不同的窗口,然后按顺序显示它们吗?

1 个答案:

答案 0 :(得分:3)

您应该可以使用以下内容:(未经测试)

Dim l_windows As New List(Of Window)

' However you want to go about populating your list of windows...
l_windows.Add( new Window1() )
l_windows.Add( new Window2() )

Dim l_random As New Random()
Dim l_randomWindows = From w In l_windows
                      Select Ordinal = l_random.Next(),
                             Window = w
                      Order By Ordinal
                      Select Window

For Each l_window in l_randomWindows
    l_window.Show()
Next

请注意,标准的.NET随机数发生器只是伪随机的,如果你需要随机性用于统计目的,那么选择不好等等(不过要找到更好的随机数生成器并不难。)

LINQ查询的说明:

  • 通过l_windows迭代,将集合中的每个项目分配给w

    From w In l_windows
    
  • 对于每个w,创建一个包含两个属性的新匿名对象:为Ordinal分配一个随机数,并将w分配给Window。 (编译器将创建一个在后台描述此匿名类型的类,但您永远不需要直接处理它。)

    Select Ordinal = l_random.Next(),
           Window = w
    
  • Ordinal订购匿名类型的对象。如果两个Ordinal是相同的,那么它将简单地一个接一个地放置(可能基于l_window的原始顺序,但我没有测试过它。)

    Order By Ordinal
    
  • 对于新近重新排序的列表中的每个匿名类型对象,选择分配给Window属性的对象。 LINQ足够聪明,可以选择值,而不是创建具有单个属性的匿名类型。

    Select Window
    
  • 然后IEnumerable(Of Window)被分配到l_randomWindows

  

注意 IEnumerable表示的对象本身不是一个集合。编译器实际上会创建一个查询对象,直到您实际尝试从集合中检索项目时才会执行该查询对象(如For循环中所示)。此查询将一次又一次地执行,每次都返回不同排序的结果(因为每次都会调用l_random.Next())。

     

如果您想获得稳定的收藏品,只需致电l_randomWindows.ToList()l_randomWindows.ToArray()并将结果分配给变量。