2010-03-25 8 views
25

Questo è davvero fastidioso. Sto usando l'etichetta come parte di un controllo utente della voce di elenco, in cui l'utente può fare clic per selezionare l'elemento dell'elenco e fare doppio clic per rinominarlo. Tuttavia, se hai un nome negli appunti, fare doppio clic sull'etichetta lo sostituirà con il testo dell'etichetta!C'è un modo per disattivare la funzionalità "doppio clic per copiare" di un'etichetta .NET?

Ho anche controllato le altre etichette nell'applicazione, e copieranno anche negli appunti su un doppio clic. Non ho scritto alcun codice degli appunti in questo programma e sto usando le etichette .NET standard.

C'è un modo per disabilitare questa funzionalità?

+2

Solo una supposizione: hai provato a gestire l'evento MouseDoubleClick e non hai fatto nulla? –

+0

Posso riprodurlo sul mio computer Vista, ma non su due mie macchine XP. – eschneider

+2

Austin: sfortunatamente non funziona. Il testo viene copiato negli appunti prima che l'evento venga attivato. –

risposta

3

Ho trovato this post. L'ultimo poster sembra aver ricevuto una soluzione da Microsoft, anche se non è una soluzione perfetta.

+2

La soluzione presentata in questo post sembra cancellare gli appunti, che è più di un passo falso. Ma un po 'preferibile al comportamento precedente, secondo me. –

+0

+1 per il post che mi ha aiutato con la mia soluzione – TKTS

+0

La prossima volta copia il post e menziona il link in modo da avere una copia qui, il post non è più valido :( –

1

La mia soluzione (terribilmente brutta, ma sembra funzionare) era copiare il testo degli appunti su una variabile locale con un clic e ripristinarlo con doppio clic se gli Appunti differiscono dalla variabile locale. Ovviamente il precursore di un doppio clic è il primo clic singolo, che è il motivo per cui funziona.

Ho intenzione di recitare questa domanda perché mi piacerebbe un metodo più pulito!

+0

Questo è un "workaround" letteralmente ... È inoltre necessario verificare il tipo di dati, poiché non è sempre 'String' che si trova negli appunti ... anche se gli appunti avevano anche alcuni dati in primo luogo. – Sree

7

Sono stato in grado di farlo utilizzando una combinazione delle altre risposte fornite. Prova a creare questa classe derivata e sostituire le etichette si desidera disattivare la funzionalità del clipboard con esso:

Public Class LabelWithOptionalCopyTextOnDoubleClick 
    Inherits Label 

    Private Const WM_LBUTTONDCLICK As Integer = &H203 

    Private clipboardText As String 

    <DefaultValue(False)> _ 
    <Description("Overrides default behavior of Label to copy label text to clipboard on double click")> _ 
    Public Property CopyTextOnDoubleClick As Boolean 

    Protected Overrides Sub OnDoubleClick(e As System.EventArgs) 
     If Not String.IsNullOrEmpty(clipboardText) Then Clipboard.SetData(DataFormats.Text, clipboardText) 
     clipboardText = Nothing 
     MyBase.OnDoubleClick(e) 
    End Sub 

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
     If Not CopyTextOnDoubleClick Then 
      If m.Msg = WM_LBUTTONDCLICK Then 
       Dim d As IDataObject = Clipboard.GetDataObject() 
       If d.GetDataPresent(DataFormats.Text) Then 
        clipboardText = d.GetData(DataFormats.Text) 
       End If 
      End If 
     End If 

     MyBase.WndProc(m) 
    End Sub 

End Class 
+0

Questo ha funzionato per me, grazie Mi sento come se questa risposta fosse contrassegnata come corretta ora poiché conserva il contenuto già presente negli appunti. – Cuthbert

+1

Ovviamente, questo conserva solo il testo .Se gli appunti contengono qualcosa in quei formati difficili da gestire in gestione codice, sei sfortunato. Penso che il modo migliore per salvare e ripristinare tutti i contenuti sarebbe una coppia di funzioni non gestite. – Medinoc

+0

Molto meglio quindi basta andare su 'Clipboard.GetDataObject(). GetFormats()' e creare un 'Dictionary ' contenente _everything_ e ripristinarlo successivamente. Comunque, sto usando la soluzione di Jaex; è molto più semplice. – Nyerguds

2

soluzione TKTS convertito in C#

Per i principianti: (aggiungi nuova classe, costruire, andare al progettista e dalla cassetta degli attrezzi drag and drop posizione di nome 'LabelWithOptionalCopyTextOnDoubleClick')

using System.ComponentModel; 
using System.Windows.Forms; 
using System; 

public class LabelWithOptionalCopyTextOnDoubleClick : Label 
{ 
    private const int WM_LBUTTONDCLICK = 0x203; 
    private string clipboardText; 

    [DefaultValue(false)] 
    [Description("Overrides default behavior of Label to copy label text to clipboard on double click")] 
    public bool CopyTextOnDoubleClick { get; set; } 

    protected override void OnDoubleClick(EventArgs e) 
    { 
     if (!string.IsNullOrEmpty(clipboardText)) 
      Clipboard.SetData(DataFormats.Text, clipboardText); 
     clipboardText = null; 
     base.OnDoubleClick(e); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (!CopyTextOnDoubleClick) 
     { 
      if (m.Msg == WM_LBUTTONDCLICK) 
      { 
       IDataObject d = Clipboard.GetDataObject(); 
       if (d.GetDataPresent(DataFormats.Text)) 
        clipboardText = (string)d.GetData(DataFormats.Text); 
      } 
     } 
     base.WndProc(ref m); 
    } 

} 
2

Quando il valore di testo interno è vuoto quindi fare doppio clic sull'etichetta non cercando di copiare valore di testo negli appunti. Questo metodo è più pulito rispetto ad altre alternative:

using System; 
using System.Windows.Forms; 

public class LabelNoCopy : Label 
{ 
    private string text; 

    public override string Text 
    { 
     get 
     { 
      return text; 
     } 
     set 
     { 
      if (value == null) 
      { 
       value = ""; 
      } 

      if (text != value) 
      { 
       text = value; 
       Refresh(); 
       OnTextChanged(EventArgs.Empty); 
      } 
     } 
    } 
} 
+1

Infatti, l'ho provato, e sembra che utilizzasse solo la variabile di testo privata dell'etichetta per la cosa degli appunti e non la proprietà pubblica. Molto particolare, ma sembra che la funzione Paint utilizzi la proprietà pubblica, quindi questa sostituzione funziona correttamente, rendendo questa correzione molto rapida e pulita. – Nyerguds

0

Ho provato le soluzioni sopra riportate e non hanno funzionato per me. = (In seguito a tale idea di base, anche se (grazie a sopra), sono arrivato qui, e questo sembra funzionare (un po 'più pulito troppo). (In esecuzione su Windows Server 2012 R2)

public class MyLabel : System.Windows.Forms.Label 
{ 
    private const int WM_LBUTTONDBLCLK = 0x203; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONDBLCLK) 
     { 
      string sSaved = Clipboard.GetText(); 
      System.Drawing.Image iSaved = Clipboard.GetImage(); 
      base.WndProc(ref m); 
      if (iSaved != null) Clipboard.SetImage(iSaved); 
      if (!string.IsNullOrEmpty(sSaved)) Clipboard.SetText(sSaved); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

qualche sforzo in più avrebbe da investire per preservare cose come campi Excel copiati e simili, anche se il principio sarebbe lo stesso. Come accennato, è possibile scorrere gli appunti per tutti i formati disponibili (o quelli a cui tieni) e inserire tali valori in un Oggetto del dizionario, e quindi ripristinarlo dopo, il testo e le immagini lo coprono per me, in questo caso

Un link utile (e cautelativo) per vedere su questo argomento è qui: How do I backup and restore the system clipboard in C#?

Problemi correlati