visual studio que propiedades musica español control .net winforms label

studio - ¿Hay alguna manera de deshabilitar la funcionalidad de "doble clic para copiar" de una etiqueta.NET?



que es textbox en visual basic (6)

Esto es realmente molesto. Estoy utilizando la etiqueta como parte de un control de usuario de elemento de lista, donde el usuario puede hacer clic en él para seleccionar el elemento de lista y hacer doble clic en él para cambiar su nombre. Sin embargo, si tiene un nombre en el portapapeles, haga doble clic en la etiqueta para reemplazarlo con el texto de la etiqueta.

También he comprobado las otras etiquetas en la aplicación, y también se copiarán en el portapapeles en un doble clic. No he escrito ningún código del portapapeles en este programa, y ​​estoy usando las etiquetas estándar de .NET.

¿Hay alguna manera de deshabilitar esta funcionalidad?


Cuando el valor del texto interno está vacío, haga doble clic en la etiqueta para no copiar el valor del texto en el portapapeles. Este método es más limpio que otras alternativas, creo:

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); } } } }


He encontrado este post . El último póster parece haber recibido una solución de Microsoft, aunque no es la solución perfecta.


Mi solución (terriblemente fea, pero parece funcionar) fue copiar el texto del portapapeles a una variable local con un solo clic, y restaurarlo al hacer doble clic si el portapapeles difiere de la variable local. Obviamente, el precursor de un doble clic es el primer clic, por lo que funciona.

¡Voy a iniciar esta pregunta porque me encantaría un método más limpio!


Probé las soluciones publicadas anteriormente y no funcionaron para mí. = (Siguiendo esa idea básica, aunque (gracias a lo anterior), llegué aquí, y esto parece funcionar (también un poco más limpio). (Ejecutándose en 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); } } }

Se debería invertir un esfuerzo adicional para preservar cosas como los campos de Excel copiados y similares, aunque el principio sería el mismo. Como se mencionó, puede recorrer en el portapapeles todos los formatos disponibles (o los que le interesan) y rellenar esos valores en un objeto Diccionario, y luego restaurarlos después. El texto y las fotos lo cubren para mí, en este caso.

Un enlace que vale la pena (y precaución) para ver sobre este tema está aquí: ¿Cómo puedo hacer una copia de seguridad y restaurar el portapapeles del sistema en C #?


Pude hacerlo usando una combinación de las otras respuestas dadas. Intente crear esta clase derivada y reemplace todas las etiquetas que desee para deshabilitar la funcionalidad del portapapeles:

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


Solución TKTS convertida a C #

Para principiantes: (agregue una nueva clase, compile, vaya al diseñador y desde la caja de herramientas arrastre y suelte la posición denominada ''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); } }