Laden...

[Gelöst] Beliebiges Control - mit angezeigter Maßeinheit dahinter

Erstellt von _Cashisclay vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.187 Views
_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren
[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

T
2.219 Beiträge seit 2008
vor 4 Jahren

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

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren

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

W
955 Beiträge seit 2010
vor 4 Jahren

* 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.

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren

Hast du denn ein Beispiel für die Trigger?

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

<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>
_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren

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


    /// <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 :



            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 :

<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