簡體   English   中英

無法通過嵌套類型“FormMain.ImageDelegateClass”訪問外部類型“FormMain”的非靜態成員

[英]Cannot access a non-static member of outer type 'FormMain' via nested type 'FormMain.ImageDelegateClass'

我需要從 MemoryStream 輸入更新 C# WinForms PictureBox。 我能夠使用

pictureBox.Image = new Bitmap(new MemoryStream(payload));

在解析 stream [ RxThread() ] 的線程中,但建議使用委托以避免不良影響。 所以我實現了這個:

private void RxThread()
{
    ...
    var imageDelegateClass = new ImageDelegateClass();
    var imageDelegate = new ImageDelegate(imageDelegateClass.SetImage);
    imageDelegate(payload);
    ...
}

delegate void ImageDelegate(byte[] payload);
class ImageDelegateClass
{
    public void SetImage(byte[] payload)
    {
        pictureBox.Image = new Bitmap(new MemoryStream(payload));
    }
}

但是當我嘗試編譯時得到以下錯誤代碼:

無法通過嵌套類型“FormMain.ImageDelegateClass”訪問外部類型“FormMain”的非靜態成員

我確信制作圖片框 static 是個壞主意,因為它是由 WinForms 生成的。 我知道維修可能很簡單,但我對 C# 有點陌生。 我已經多次閱讀 Jon Skeets C# In Depth 2nd Edition 中關於代表的章節,但這是我第一次真正嘗試使用它。 如何更改SetImage()以便它可以訪問圖片框?

您應該將該方法移至 class 本身的形式。
您根本不需要單獨的 class。

此外,您可以使用內置的Action<byte[]>委托,而不是創建自己的委托類型。

此外,直接調用委托對您沒有任何好處。 它仍將在后台線程上運行。

您需要調用BeginInvoke(new Action<byte[]>(this.SetImage), payload)在 UI 線程上運行委托。

這里有兩個問題:1,將成為代表的 function 可以而且應該在同一個 class 中(正如其他答案指出的那樣),而不是自己的 class 。

其次,您沒有正確遵循上一個答案的建議。 在委托中進行更新是不夠的; 您必須在控件上使用 Invoke 方法來運行委托,以便它在 UI 線程中運行。 如果您按照現在的方式運行委托,它仍然在同一個線程上,您仍然會遇到同樣的問題。

您可以在 setImage 中引發事件以將數據和通知傳遞給主窗體。 另一種方法是使用 InvokeRequied,將當前調用移動到創建的線程控件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM