none
IsReadOnlyCaretVisible RRS feed

  • Frage

  • Hallo,

    Ich brauche TextBox die aussieht wie ein TextBlock oder ein Label, also habe ich eine TextBox mit IsReadOnly="True" und IsReadOnlyCaretVisible="False" benutzt. IsReadOnlyCaretVisible scheint aber keinen Effect zu haben, egal ob ich die Eigenschaft auf "True" oder "False" setzte, ich kann immer Text markieren und der Cursor ist "Caret".

    Einen z.B. TextBlock kann ich nicht benutzen, da der anders aussieht als eine TextBox.

    Danke und Gruß Scotty

    Donnerstag, 29. Januar 2015 05:05

Antworten

  • Hallo Karsten,

    ich glaube eher, dass ein Problem ein Design-Problem ist. Was spricht denn dagegen, dass der Benutzer den Text markiert, und das gegeben falls auch mit einem Caret macht?

    Dies ist doch sogar gut, denn dann weiß der Benutzer direkt, dass dies auch bearbeitbar sein kann. Du kannst natürlich auch das gesamte Element deaktivieren, in dem du die IsEnabled-Eigenschaft verwendest.

    MyTextBox.IsEnabled = false; //Deaktivieren

    Zur not kannst auch auch das gesamte Element mittels eines Styles mit einem Trigger für IsReadOnly=False festlegen.

    Wenn du mit diesen Lösungsvorschlägen nicht weiterkommen solltest, dann wäre es gut, wenn du uns mal ein Screenshot (Teil) zeigst, wo man das Problem erkennen kann.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Freitag, 30. Januar 2015 05:59
  • Hallo Thomas,

    IsEnable und IsReadOnly sind schon mal zwei völlig unterschiedliche Paar Schuhe.

    IsEnable="False" unterbindet alle Benutzerinteraktion Maus-, Tastatureingaben, Kontextmenu.

    IsReadOnly hingegen schützt lediglich vorm "überschreibem", Interaktionen sind weiterhin möglich.

    Den Rückschluss zu führen, dass etwas markierbar auch änderbar ist finde ich doch sehr gewagt.

    In meinem Anwendungsbeispiel habe ich 2 Elemente genannt wo der Einsatz denkbar ist. Schaut man nun auf den bspw. File-Explorer so hat man dort ein TreeView auf der einen Seite und ein ListView auf der anderen Seite. Umbenennen der Element ist möglich aber erst nicht ersichtlich. Bei Beiden kann man das über die F2-Taste oder das Kontextmenu, beim ListView zusätzlich über einen "verlängerten Doppelklick" erreichen. Das Anklicken oder Doppelkicken hat hier andere Funktionalitäten als es bei einer einfachen TextBox der Fall ist. Selbst wenn die TextBox readonly wäre würde ein Doppelklick zum teilweise oder gesamten Markieren des Textes führen.

    Letztendlich will ich ja eine Funktionalität abbilden die es an fast jeder Stelle in der Microsoft-Oberfläche gibt, eben diese hierarchischen Anschichten. Ergo orientiert man sich an dem wie es an andere Stelle gehandhabt wird.

    Stell Dir mal vor fast 100% Deiner installierten Anwendungen reagieren beim Drücken der F1-Taste mit dem Hilfe-Dialog nur eine nicht, die fängt an zu drucken oder zeigt Dir den Dialog für die Einstellungen. Gleiches gilt hier. Alle Anwendungen halten sich an die oben genannten Merkmale nur Deine nicht. Als benutzerfreundlich würde ich das nicht einstufen.

    Leider ist manches nicht so einfach zu lösen und man muss etwas tricksen, jedoch darf man den Grund nicht aus den Augen verlieren.

    Gruß Scotty

    Freitag, 30. Januar 2015 08:48

Alle Antworten

  • Hallo Karsten,

    Du brauchst:

      TextBox, die aussieht wie ein TextBlock?

    Du kannst das aber nicht verwenden weil:

      TextBlock, da der anders aussieht als eine TextBox?

    Dass sich das komplett wiederspricht, ist aber klar, oder?

    Wenn das irgendwie ein Schreibfehler war, nimm doch einen TextBlock und style den einfach so um, dass er so aussieht, wie Du es gerne hättest (wie auch immer das sein mag).


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 29. Januar 2015 08:33
  • Hallo Stefan,

    Erklärungsversuch:

    wenn man eine TextBox und einen TextBlock im Aussehen vergleicht(gleiche Font-Eigenschaften vorausgesetzt) so unterscheiden die sich(Beim TextBlock ist der Abstand zwischen den Zeichen geringer).

    Ich möchte nun Informationen anzeigen, die erstmal nicht editierbar sind(Auswahl wäre ein TextBlock). Hier das Augenmerk auf "erstmal nicht editierbar" das heißt sie könnten editierbar werden(also TextBox Mit umschaltbarem IsReadOnly). Wäre ja schön wenn da nicht das Wörtchen "aber" wäre.

    Eine TextBox Mit IsReadOnly="True" lässt es zu das man den Text markieren kann und zudem ist der Cursor="Caret" - Das darf nicht sein.

    Also IsReadOnlyCaretVisible="False". Wenn ich die MSDN richtig verstanden habe sollte dann das Verhalten genau so sein wie ich es mir wünsche. Nur hat IsReadOnlyCaretVisible bei mir keinen Einfluss(Ziel-Framework 4.5).

    Gruß Scotty

    Donnerstag, 29. Januar 2015 09:07
  • Hallo Karsten,

    IsReadOnlyCaretVisible=false hat lt. MSDN lediglich die Auswirkung, dass innerhalb der TextBox kein Caretzeichen angezeigt wird. Der Cursor beim Hover ist davon unabhängig. Zudem kann der User so oder so immer Text selektieren und kopieren.

    Daher würde ich schon mal schauen, einen TextBlock für die ReadOnly Variante zu nehmen, für die Edit Variante dann eine TextBox. Das kann man ja dynamisch umschalten.

    Die Zeilenhöhe kannst Du bspw. über LineHeight beeinflussen.

      https://msdn.microsoft.com/de-de/library/system.windows.controls.textblock.lineheight.aspx

    Rahmen, ... sind ebenfalls einstellbar. Die Zeichenbreite/Zeichenabstände könntest Du evtl. über die FontStretch Eigenschaft angeben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 29. Januar 2015 09:30
  • Hier die vorgeschlagene Lösung aus dem englischen Forum:

    IsReadOnly="True" IsReadOnlyCaretVisible="False" SelectionBrush="{x:Null}" Cursor="Arrow" ContextMenu="{x:Null}"

    So ähnlich hatte ich es schon gelöst nur das ich SelectionStart und SelectionLength auf 0 gesetzt habe wenn sich die Selection ändert.

    Gruß Scotty

    Donnerstag, 29. Januar 2015 09:38
  • Hallo,

    hier kann man sehen, das ein TextBlock und eine TextBox unterschiedliches Aussehen haben, auch wenn man die BorderThickness-Eigenschaft auf "0" setzt.

    <Canvas>
        <TextBox Canvas.Left="10" Canvas.Top ="10"
                 Text="Hello world" 
                 Background="DodgerBlue"
                 BorderThickness="0"
                 IsReadOnly="True" 
                 IsReadOnlyCaretVisible="False" 
                 IsHitTestVisible="False" />
        <TextBlock Canvas.Left="10" Canvas.Top ="32" 
                   Text="Hello world"
                   Background="Lime" />
        <TextBlock Canvas.Left="80" Canvas.Top ="10" 
                   Text="Hello world"
                   Background="Lime" />
    </Canvas>
    

    Interessant ist hier aber für die TextBox:

                 IsReadOnly="True" 
                 IsReadOnlyCaretVisible="False" 
                 IsHitTestVisible="False"

    Damit verhält sich die TextBox von Seiten der Maus-Interaktivität wie ein TextBlock.

    Anwendungsbeispiel:

    Schaltet man die 3 Eigenschaften um so kann man daraus eine neue Eigenschaft "IsEditable" mache. Gut einzusetzen bei TreeViewItems und ListViewItems die normal nicht editierbar sind.

    Gruß Scotty

    Freitag, 30. Januar 2015 05:23
  • Hallo Karsten,

    ich glaube eher, dass ein Problem ein Design-Problem ist. Was spricht denn dagegen, dass der Benutzer den Text markiert, und das gegeben falls auch mit einem Caret macht?

    Dies ist doch sogar gut, denn dann weiß der Benutzer direkt, dass dies auch bearbeitbar sein kann. Du kannst natürlich auch das gesamte Element deaktivieren, in dem du die IsEnabled-Eigenschaft verwendest.

    MyTextBox.IsEnabled = false; //Deaktivieren

    Zur not kannst auch auch das gesamte Element mittels eines Styles mit einem Trigger für IsReadOnly=False festlegen.

    Wenn du mit diesen Lösungsvorschlägen nicht weiterkommen solltest, dann wäre es gut, wenn du uns mal ein Screenshot (Teil) zeigst, wo man das Problem erkennen kann.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Freitag, 30. Januar 2015 05:59
  • Hallo Thomas,

    IsEnable und IsReadOnly sind schon mal zwei völlig unterschiedliche Paar Schuhe.

    IsEnable="False" unterbindet alle Benutzerinteraktion Maus-, Tastatureingaben, Kontextmenu.

    IsReadOnly hingegen schützt lediglich vorm "überschreibem", Interaktionen sind weiterhin möglich.

    Den Rückschluss zu führen, dass etwas markierbar auch änderbar ist finde ich doch sehr gewagt.

    In meinem Anwendungsbeispiel habe ich 2 Elemente genannt wo der Einsatz denkbar ist. Schaut man nun auf den bspw. File-Explorer so hat man dort ein TreeView auf der einen Seite und ein ListView auf der anderen Seite. Umbenennen der Element ist möglich aber erst nicht ersichtlich. Bei Beiden kann man das über die F2-Taste oder das Kontextmenu, beim ListView zusätzlich über einen "verlängerten Doppelklick" erreichen. Das Anklicken oder Doppelkicken hat hier andere Funktionalitäten als es bei einer einfachen TextBox der Fall ist. Selbst wenn die TextBox readonly wäre würde ein Doppelklick zum teilweise oder gesamten Markieren des Textes führen.

    Letztendlich will ich ja eine Funktionalität abbilden die es an fast jeder Stelle in der Microsoft-Oberfläche gibt, eben diese hierarchischen Anschichten. Ergo orientiert man sich an dem wie es an andere Stelle gehandhabt wird.

    Stell Dir mal vor fast 100% Deiner installierten Anwendungen reagieren beim Drücken der F1-Taste mit dem Hilfe-Dialog nur eine nicht, die fängt an zu drucken oder zeigt Dir den Dialog für die Einstellungen. Gleiches gilt hier. Alle Anwendungen halten sich an die oben genannten Merkmale nur Deine nicht. Als benutzerfreundlich würde ich das nicht einstufen.

    Leider ist manches nicht so einfach zu lösen und man muss etwas tricksen, jedoch darf man den Grund nicht aus den Augen verlieren.

    Gruß Scotty

    Freitag, 30. Januar 2015 08:48