【问题标题】:How can i update in live real time listBox adding items from another class?如何在实时实时列表框中更新添加来自另一个类的项目?
【发布时间】:2015-09-30 02:43:09
【问题描述】:

我在一个新类中有这段代码:

private static bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam)
{
    bool specialCapturing = false;

    if (hWnd == IntPtr.Zero) return false;

    if (!IsWindowVisible(hWnd)) return true;

    if (!countMinimizedWindows)
    {
        if (IsIconic(hWnd)) return true;
    }
    else if (IsIconic(hWnd) && useSpecialCapturing) specialCapturing = true;

    if (GetWindowText(hWnd) == PROGRAMMANAGER) return true;

    windowSnaps.Add(new WindowSnap(hWnd, specialCapturing));
    doStuff(new WindowSnap(hWnd, specialCapturing));

    return true;
}

public static void doStuff(object objtoadd)
{
    foreach (Form frm in Application.OpenForms)
    {
        if (frm.GetType() == typeof(Form1))
        {
            Form1 frmTemp = (Form1)frm;
            frmTemp.addItemToListBox(objtoadd);

        }
    }
}

当运行程序时,它会到达该行:

doStuff(new WindowSnap(hWnd, specialCapturing));

但它永远不会过线:

if (frm.GetType() == typeof(Form1))

在form1中我做到了:

public void addItemToListBox(object item)
{
    listBoxSnap.Items.Add(item);
}

但它从未调用过 addItemToListBox,因为它没有通过类中的行。

我的主要目标是在添加一项的新类中实时更新 form1(listBoxSnap) 中的列表框:

frmTemp.addItemToListBox(objtoadd);

然后在 listBox 中显示/显示该项目,然后是下一个项目,依此类推。 直到现在我做到了:

this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray());

但这需要时间,因为它必须等到所有项目都添加后才能在 listBoxSnap 中显示它们。

WindowSnap 是新类,GetAllWindows 是:

public static WindowSnapCollection GetAllWindows(bool minimized, bool specialCapturring)
{
    windowSnaps = new WindowSnapCollection();
    countMinimizedWindows = minimized;//set minimized flag capture
    useSpecialCapturing = specialCapturring;//set specialcapturing flag
    EnumWindowsCallbackHandler callback = new EnumWindowsCallbackHandler(EnumWindowsCallback);
    EnumWindows(callback, IntPtr.Zero);
    return new WindowSnapCollection(windowSnaps.ToArray(), true);
}

在此方法中,它调用 EnumWindowsCallback,我想在其中更新 listBoxSnap。

也许我需要以某种方式更新公共静态 WindowSnapCollection GetAllWindows 方法中的 listBoxSnap。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    对我来说太多的代码。但是要回答这个问题。

    既然你说real time 我必须假设回调和DoStuff 是在非UI 线程上运行的。要对Control 执行任何操作,您必须在 UI 线程上。您可以使用Control.Invoke 来执行此操作。

     public static void doStuff(object objtoadd)
     {
        foreach (Form1 frm in Application.OpenForms.OfType<Form1>())
        {
           frm.Invoke(() => frm.addItemToListBox(objtoadd));
        }
      }
    

    请注意,OfType<Form1>() 是在 System.Linq 中定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多