myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- GUI: WPF und Silverlight (https://www.mycsharp.de/wbb2/board.php?boardid=85)
--- [Gelöst] Beliebiges Control - mit angezeigter Maßeinheit dahinter (https://www.mycsharp.de/wbb2/thread.php?threadid=121879)


Geschrieben von _Cashisclay am 16.05.2019 um 13:21:
  [Gelöst] Beliebiges Control - mit angezeigter Maßeinheit dahinter
Hallo zusammen,

ich hätte gerne die Maßeinheit (g, Kg etc.) direkt in (Beispielsweise : TextBox, NumericUpDown)
dem jeweiligen Control hinter dem Inhalt drin.

Das sobald etwas eingegeben wurde immer die entsprechend hintrelegte Einheit dahinter angezeigt wird.

Hat damit jemand Erfahrung oder eine Lösung parat?

Grüße


Geschrieben von T-Virus am 16.05.2019 um 14:55:
 
Woran soll anhand der Eingabe erkannt werden ob du 1.000 Gramm, Kilo oder Tonnen als Anwender eingeben willst?
Solche Maßeinheiten sind i.d.R. spezifisch auszuwählen.

Nachtrag:
In einer Textbox würde ich dies übrigens nicht einfügen.
Wenn du nur die numerischen Werte willst, musst du dann den Text wiederum um die Maßeinheit befreien.
Macht unnötig Mehraufwand auf deiner Seite.

T-Virus


Geschrieben von _Cashisclay am 16.05.2019 um 14:59:
 
für nummerische Werte wäre natürlich ein anderes Control besser.

Das soll die Eingabe gar nicht erkennen ich will einfach nur hinter der Eingabe die Einheit stehen haben, die geb ich dem Control auch gerne mit, wenn es das dann kann.

Ich finde aktuell nichts.

Grüße


Geschrieben von witte am 16.05.2019 um 19:37:
 
* Manche Controls besitzen ein EditTemplate und ein DisplayTemplate, die ausgetauscht werden wenn der Cursor drin ist (DataGridTextViewColumn?).
* eine zweite Möglichkeit wären vllt Trigger: zeige ein anderes Property an wenn das Control den Focus hat (z.B watermark): zeige die Einheit an wenn der Wert gerade nicht bearbeitet wird.


Geschrieben von _Cashisclay am 17.05.2019 um 06:58:
 
Hast du denn ein Beispiel für die Trigger?

An und für sich klingt das ja gut, klappt nur aktuell nicht so einfach.

XML-Code:
<Trigger Property="IsFocused" Value="True">

                                                <Setter Property="Text" Value="{Binding MaterialPreparationOfProtocols.Item.LastnameOfChildren, UpdateSourceTrigger=PropertyChanged}"/>

                                            </Trigger>

                                            <Trigger Property="IsFocused" Value="False">

                                                <Setter Property="Text" Value="{Binding MaterialPreparationOfProtocols.Item.LastnameOfChildren, StringFormat={}{0}g, UpdateSourceTrigger=PropertyChanged}"/>

                                            </Trigger>


Geschrieben von _Cashisclay am 17.05.2019 um 10:32:
 
Okay habs hinbekommen, die Idee mit dem Focus hatte ich auch schon, aber irgendwie hatte ich das nicht weiterverfolgt .. der Denkanstoß hat mir geholfen Danke!

Lösung :

Zusätzliche Klasse für das Focus Event

C#-Code:
    /// <summary>
    ///     Solution of this Class
    ///         https://stackoverflow.com/questions/1356045/set-focus-on-textbox-in-wpf-from-view-model-c
    /// </summary>

    public static class FocusBehavior
    {

        #region Dependency Properties

            public static readonly DependencyProperty IsFocusedProperty =
                        DependencyProperty.RegisterAttached("IsFocused",
                                                                typeof(bool?),
                                                                    typeof(FocusBehavior),
                                                                        new FrameworkPropertyMetadata(IsFocusedChanged){ BindsTwoWayByDefault = true });

        #endregion

        #region Private Methods

            private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {

                var fe = (FrameworkElement)d;

                    if (e.OldValue == null)
                    {

                        fe.GotFocus += FrameworkElement_GotFocus;

                        fe.LostFocus += FrameworkElement_LostFocus;

                    }

                        if (!fe.IsVisible)
                        {

                            fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged);

                        }

                            if ((bool)e.NewValue)
                            {

                                fe.Focus();

                            }

            }

            private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
            {

                var fe = (FrameworkElement)sender;

                    if (fe.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty))
                    {

                        fe.IsVisibleChanged -= fe_IsVisibleChanged;

                        fe.Focus();

                    }

            }

            private static void FrameworkElement_GotFocus(object sender, RoutedEventArgs e)
            {

                ((FrameworkElement)sender).SetValue(IsFocusedProperty, true);

            }

            private static void FrameworkElement_LostFocus(object sender, RoutedEventArgs e)
            {

                ((FrameworkElement)sender).SetValue(IsFocusedProperty, false);

            }

        #endregion

        #region Public Methods

            #region Get

                public static bool? GetIsFocused(DependencyObject element)
                {

                        if (element == null)
                        {

                            throw new ArgumentNullException("element");

                        }

                    return (bool?)element.GetValue(IsFocusedProperty);
                }

            #endregion

            #region Set

                public static void SetIsFocused(DependencyObject element, bool? value)
                {

                        if (element == null)
                        {

                            throw new ArgumentNullException("element");

                        }

                    element.SetValue(IsFocusedProperty, value);

                }

            #endregion

        #endregion

    }

MVVM :

C#-Code:
            public string                               TextBoxMaterialPreparationProtcolsWeightText
            {
                get
                {
                    if (TextBoxMaterialPreparartionProtocolsWeightIsFocused)
                    {

                        return Item.Weight.ToString();

                    } else { return Item.Weight + "g"; }
                }
                set
                {

                    // Regex

                        Regex Regex = new Regex("^*[0-9]$");

                            if (Regex.IsMatch(value.ToString()))
                            {

                                Item.Weight = value != null ? Convert.ToInt32(value) : (int?)null;

                            }
else
                            {

                                if (String.IsNullOrEmpty(value)) { Item.TimeShift = null; }

                            }

                    Raise(nameof(TextBoxMaterialPreparationProtcolsWeightText));

                }
            }

            public bool                                 TextBoxMaterialPreparartionProtocolsWeightIsFocused
            {
                get { return _TextBoxMaterialPreparartionProtocolsWeightIsFocused; }
                set
                {
                    _TextBoxMaterialPreparartionProtocolsWeightIsFocused = value;
                    Raise(nameof(TextBoxMaterialPreparartionProtocolsWeightIsFocused));

                        Raise(nameof(TextBoxMaterialPreparationProtcolsWeightText));
                }
            }

XAML :

XML-Code:
<TextBox    Grid.Column="1"
                                            HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                                                MaxLength="9"
                                                    mah:TextBoxHelper.ClearTextButton="False"
                                                        FocusBehavior:FocusBehavior.IsFocused="{Binding MaterialPreparationOfProtocols.TextBoxMaterialPreparartionProtocolsWeightIsFocused, UpdateSourceTrigger=PropertyChanged}"
                                                            Text="{Binding MaterialPreparationOfProtocols.TextBoxMaterialPreparationProtcolsWeightText, UpdateSourceTrigger=PropertyChanged}"
                                        Style="{StaticResource BaseTextBox}"
/>

Grüße


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.07.2019 17:43