2015-01-07 21 views
5

ho scritto un controllo utente, MenuItem, che eredita da un Form Label.Come faccio a leggere una proprietà dalla mia forma principale di un controllo utente

Ho un filo BackgroundWorker cui proprietà IsBusy è esposta attraverso una proprietà nel MainForm come IsBackgroundBusy.

Come posso leggere questo immobile dal UserControl MenuItem? Attualmente sto usando Application.UseWaitCursor e l'ho impostato nel backgroundworker e funziona perfettamente, tuttavia non voglio che il cursore cambi. Ecco perché ho pensato che una proprietà che avrei potuto impostare sarebbe stata molto meglio.

Ecco il codice nel mio MainForm:

public partial class MainForm : Form 
{ 
    public bool IsBackgroundBusy 
    { 
     get 
     { 
      return bwRefreshGalleries.IsBusy; 
     } 
    } 

Ecco il codice per il mio UserControl:

public partial class MenuItem: Label 
{ 
    private bool _disableIfBusy = false; 

    [Description("Change color if Application.UseWaitCursor is True")] 
    public bool DisableIfBusy 
    { 
     get 
     { 
      return _disableIfBusy; 
     } 

     set 
     { 
      _disableIfBusy = value; 
     } 
    } 

    public MenuItem() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnMouseEnter(EventArgs e) 
    { 
     if (Application.UseWaitCursor && _disableIfBusy) 
     { 
      this.BackColor = SystemColors.ControlDark; 
     } 
     else 
     { 
      this.BackColor = SystemColors.Control; 
     } 

     base.OnMouseEnter(e); 
    } 
+0

Il cuore della tua domanda su come [accedere al modulo da usercontrol] (http://stackoverflow.com/questions/14921354/access-form-from-usercontrol)? – ryanyuyu

+0

Sì, suppongo di sì. So che posso utilizzare un evento nel modulo, ma volevo evitarlo, se possibile, per semplicità, quando riusciamo il controllo poiché verranno create molte voci di menu. – RoadRacer524

+0

@ryanyuyu Che funziona fintanto che non ti interessa bloccare l'usercontrol per un tipo di modulo. Più complicato sarebbe creare un'interfaccia del modulo e avere le forme che usano il controllo ereditarlo. –

risposta

1

(Nota: non è chiaro se si dispone di un vero e proprio UserControl qui o non. la classe MenuItem si mostra eredita Label, non UserControl. probabilmente si dovrebbe evitare di usare il termine "UserControl" o "controllo utente" quando non si è in realtà a che fare con un oggetto UserControl).

Assente un esempio di codice completo, è difficile sapere esattamente quale sia la soluzione qui è. Tuttavia, supponendo che si stia utilizzando lo standard BackgroundWorker in modo tipico, è sufficiente che il proprietario del controllo (ad esempio il contenitore Form) passi lo stato necessario al controllo man mano che cambia. Es .:

class MenuItem : Label 
{ 
    public bool IsParentBusy { get; set; } 
} 

// I.e. some method where you are handling the BackgroundWorker 
void button1_Click(object sender, EventArgs e) 
{ 
    // ...some other initialization... 

    bwRefreshGalleries.RunWorkerCompleted += (sender1, e1) => 
    { 
     menuItem1.IsParentBusy = false; 
    }; 

    menuItem1.ParentIsBusy = true; 
    bwRefreshGalleries.RunAsync(); 
} 

Se si dispone già di un gestore per l'evento RunWorkerCompleted, quindi basta mettere la dichiarazione per impostare la proprietà IsParentBusy lì, invece di aggiungere un altro gestore.

Quindi, anziché utilizzare la proprietà Application.UseWaitCursor, è sufficiente osservare la proprietà IsParentBusy.

Esistono altri meccanismi che è possibile utilizzare; Sono d'accordo con l'opinione generale che il controllo MenuItem non deve essere legato alla sottoclasse specifica Form. Se per qualche motivo il precedente non funziona nel tuo caso, è necessario approfondire la tua domanda: fornire un buon esempio di codice e spiegare esattamente perché semplicemente avere il contenitore del controllo gestire il suo stato direttamente non funziona per voi

+0

Grazie per aver chiarito la terminologia che dovrei usare per descrivere correttamente la mia domanda e anche per la risposta. Realizza esattamente quello che voglio solo in un metodo diverso che non ho considerato. Tuttavia, sto ricevendo un errore durante l'impostazione (mittente, e). Non può essere dichiarato in questo ambito perché darebbe un significato diverso a 'mittente'. Ma quello che stai sottolineando è perfetto se riesco a farlo funzionare. – RoadRacer524

+0

Stavo annegando in una pozzanghera. Ho dichiarato un "nuovo" mittente e eventargs (s, i) e funziona perfettamente. Grazie a @Peter! – RoadRacer524

+0

Felice di aiutare. Ci scusiamo per l'errore ... modifico il post per risolvere il problema, nel caso in cui qualcun altro stia cercando una soluzione simile. Sono contento che tu sia stato in grado di capire il mio errore da solo. :) –