[英]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.