2013-08-22 6 views
0

Я действительно знаком с использованием обработчиков событий в C# в WinForms и на данный момент у меня есть следующее сообщение об ошибке:обработчиков событий в C#

Error 1 The type 'DotFlickScreenCapture.ScreenCapture' cannot be used as type parameter 'TEventArgs' in the generic type or method 'System.EventHandler'. There is no implicit reference conversion from 'DotFlickScreenCapture.ScreenCapture' to 'System.EventArgs'.

Я попытался найти способ победить эту ошибку, но до сих пор мои поисковые запросы Google ничего не отображали.

Линия точек эта ошибка это одна:

public EventHandler<ScreenCapture> capture; 

И от того, что я могу сказать, этот класс:

public class ScreenCapture 
{ 
    public delegate void StatusUpdateHandler(object sender, ProgressEventArgs e); 
    public event StatusUpdateHandler OnUpdateStatus; 

    public bool saveToClipboard = true; 

    public void CaptureImage(bool showCursor, Size curSize, Point curPos, Point SourcePoint, Point DestinationPoint, Rectangle SelectionRectangle, string FilePath, string extension) 
    { 
     Bitmap bitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height); 

     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size); 

      if (showCursor) 
      { 
       Rectangle cursorBounds = new Rectangle(curPos, curSize); 
       Cursors.Default.Draw(g, cursorBounds); 
      } 
     } 

     if (saveToClipboard) 
     { 

      Image img = (Image)bitmap; 
      Clipboard.SetImage(img); 

      if (OnUpdateStatus == null) return; 

      ProgressEventArgs args = new ProgressEventArgs(img); 
      OnUpdateStatus(this, args); 
     } 
     else 
     { 
      switch (extension) 
      { 
       case ".bmp": 
        bitmap.Save(FilePath, ImageFormat.Bmp); 
        break; 
       case ".jpg": 
        bitmap.Save(FilePath, ImageFormat.Jpeg); 
        break; 
       case ".gif": 
        bitmap.Save(FilePath, ImageFormat.Gif); 
        break; 
       case ".tiff": 
        bitmap.Save(FilePath, ImageFormat.Tiff); 
        break; 
       case ".png": 
        bitmap.Save(FilePath, ImageFormat.Png); 
        break; 
       default: 
        bitmap.Save(FilePath, ImageFormat.Jpeg); 
        break; 
      } 
     } 
    } 
} 


public class ProgressEventArgs : EventArgs 
{ 
    public Image CapturedImage { get; private set; } 
    public ProgressEventArgs(Image img) 
    { 
     CapturedImage = img; 
    } 
} 

Кто-нибудь когда-либо испытывали эту ошибку раньше? Так, как я могу его преодолеть?

ответ

6

Класс ScreenCapture должен состоять из класса EventArgs, который будет использоваться так, как вы хотите.

public class ScreenCapture : EventArgs 

И тогда (во избежание недоразумений) он должен быть назван ScreenCaptureEventArgs. Думая об этом, было бы проще просто создать класс ScreenCaptureEventArgs, который происходит от EventArgs и содержит свойство ScreenCapture, это экземпляр класса, который у вас уже есть.

Как что:

public class ScreenCaptureEventArgs : EventArgs 
{ 
    public ScreenCaptureEventArgs(ScreenCapture c) 
    { 
     Capture = c; 
    } 

    public ScreenCapture Capture { get; private set; } 
} 

public event EventHandler<ScreenCaptureEventArgs> ScreenCaptured; 
+1

Кажется, это не требуется в 4,5 –

+1

Именно то, что я только что узнал. Пробовал компилировать в 4.0 проект 4.5.2 и получил ошибку. 4.0 должно явно сказать, что это «EventArgs», а в 4.5 + вам не нужно. Я просто предполагаю, что общий, который вы передаете, является «EventArgs» – Franck

Смежные вопросы