Wo befindet sich das WPF Numeric UpDown-Steuerelement?

124

Einstieg in das erste ernsthafte WPF-Projekt. Es scheint, als ob viele grundlegende Steuerelemente fehlen. Insbesondere suche ich nach dem Numeric UpDown-Steuerelement. Gab es eine Veröffentlichung außerhalb der Band, die ich verpasst habe? Ich habe wirklich keine Lust, meine eigene Kontrolle zu schreiben.

Ich möchte den WindowsFormHost nicht verwenden und eine WinForm-CTL darauf plumpsen. Ich möchte, dass es vollständig WPF ohne alten Müll ist.

Vielen Dank

AngryHacker
quelle
4
Das Extented WPF Toolkit hat eines: NumericUpDown ! Alternativtext
Eduardo Molteni
20
Dieser einzelne Kommentar ist der größte Verkehrstreiber für meinen Blog aller Zeiten. Bis heute. Urkomisch.
Kevin Moore
1
Mögliches Duplikat des Good NumericUpDown-Äquivalents in WPF?
J c
3
Die Frage lautet "Wo befindet sich das numerische UpDown-Steuerelement von WPF?". Keine dieser Antworten beantwortet diese Frage. Ich würde erwarten, dass die Art der Antwort die Form hat "sie haben beschlossen, sie in wpf loszuwerden, weil ...". Ich kenne diese Antwort jedoch nicht
Assimilater
2
Das WPF Toolkit macht weit mehr Probleme als es löst, es enthält einige offensichtliche Fehler; und es gibt kein NumericUpDown-Steuerelement von Microsoft ... verdammt, lebt WPF überhaupt noch?
J00hi

Antworten:

48

Verwenden Sie einfach das IntegerUpDownSteuerelement im xtended wpf-Toolkit. Sie können es folgendermaßen verwenden:

  1. Fügen Sie Ihrer XAML den folgenden Namespace hinzu:

    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"

  2. In Ihrer XAML, in der Sie das Steuerelement verwenden möchten, verwenden Sie:

    <xctk:IntegerUpDown Name="myUpDownControl" />

Gestapelt
quelle
6
Beachten Sie, dass die kostenlose Version dieser Bibliothek unter der Microsoft Public License veröffentlicht wird, was bedeutet, dass Sie den vollständigen Quellcode dahinter erhalten (lesen Sie den vollständigen Lizenztext für Details). Die UpDown-Steuerelemente sind Teil der kostenlosen Version. Es gibt auch eine kostenpflichtige Version der Bibliothek, die viel mehr Steuerelemente / Themen enthält.
jrh
Gibt es eine Möglichkeit, diese benutzerdefinierten WPF-Steuerelemente zur Vereinfachung in der VS Toolbox anzuzeigen? Ich konnte sie unter "Extras -> Toolbox-Elemente auswählen" nicht finden.
Flieger
2
Es ist zu beachten, dass ab Version v3.7.0 die Open-Source-Version von wpftoolkit unter einer proprietären nichtkommerziellen Lizenz und nicht unter MS-PL ( Referenz )
bereitgestellt wird
46

Ich habe meine eigenen gemacht;

das xaml

<StackPanel Orientation="Horizontal">
    <TextBox x:Name="txtNum" x:FieldModifier="private" Margin="5,5,0,5" Width="50" Text="0" TextChanged="txtNum_TextChanged" />
    <Button x:Name="cmdUp" x:FieldModifier="private" Margin="5,5,0,5" Content="˄" Width="20" Click="cmdUp_Click" />
    <Button x:Name="cmdDown" x:FieldModifier="private" Margin="0,5,0,5"  Content="˅" Width="20" Click="cmdDown_Click" />
</StackPanel>

und der Code dahinter

private int _numValue = 0;

public int NumValue
{
    get {  return _numValue; }
    set
    {
        _numValue = value;
        txtNum.Text = value.ToString();
    }
}

public NumberUpDown()
{
    InitializeComponent();
    txtNum.Text = _numValue.ToString();
}

private void cmdUp_Click(object sender, RoutedEventArgs e)
{
    NumValue++;
}

private void cmdDown_Click(object sender, RoutedEventArgs e)
{
    NumValue--;
}

private void txtNum_TextChanged(object sender, TextChangedEventArgs e)
{
    if (txtNum == null)
    {
        return;
    }

    if (!int.TryParse(txtNum.Text, out _numValue))
        txtNum.Text = _numValue.ToString();
}
Michael
quelle
Das textChanged-Ereignis existiert nicht für ein Textfeld in WPF .net 4
AliR
Diese Methode weist einige Einschränkungen auf: 1) Die TextBox wird mit dem Steuerelement nicht horizontal gedehnt, wie dies bei Winforms der Fall ist, und weniger wichtig. 2) Im Gegensatz zu Winforms NumericUpDown ermöglicht dieses Steuerelement vertikales Dehnen, was harmlos ist, aber etwas albern aussieht . Beachten Sie, dass die Lösung in Sonorx 'Antwort diese Probleme nicht aufweist.
jrh
2
NumValue sollte eine Abhängigkeitseigenschaft sein, um eine Bindung zu ermöglichen. Auch andere Eigenschaften wie MinValue und MaxValue wären hilfreich.
Konrad
Diese Lösung ist lahm. Es ist ein benutzerdefiniertes Steuerelement ohne Unterstützung für wpf-Datenbindung, geroutete Ereignisse und Befehle.
Xam
18

Dies ist ein Beispiel für mein eigenes UserControl mit Auf- und Ab-Tasten.

Xaml-Code:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="13" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="13" />
        <RowDefinition Height="13" />
    </Grid.RowDefinitions>
    <TextBox Name="NUDTextBox"  Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" TextAlignment="Right" PreviewKeyDown="NUDTextBox_PreviewKeyDown" PreviewKeyUp="NUDTextBox_PreviewKeyUp" TextChanged="NUDTextBox_TextChanged"/>
    <RepeatButton Name="NUDButtonUP"  Grid.Column="1" Grid.Row="0" FontSize="8" FontFamily="Marlett" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="NUDButtonUP_Click">5</RepeatButton>
    <RepeatButton Name="NUDButtonDown"  Grid.Column="1" Grid.Row="1" FontSize="8"  FontFamily="Marlett" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Height="13" VerticalAlignment="Bottom" Click="NUDButtonDown_Click">6</RepeatButton>
</Grid>

Und der Code:

public partial class NumericUpDown : UserControl
{
    int minvalue = 0, 
        maxvalue = 100,
        startvalue = 10;
    public NumericUpDown()
    {
        InitializeComponent();
        NUDTextBox.Text = startvalue.ToString();
    }

    private void NUDButtonUP_Click(object sender, RoutedEventArgs e)
    {
        int number;
        if (NUDTextBox.Text != "") number = Convert.ToInt32(NUDTextBox.Text);
        else number = 0;
        if (number < maxvalue)
            NUDTextBox.Text = Convert.ToString(number + 1); 
    }

    private void NUDButtonDown_Click(object sender, RoutedEventArgs e)
    {
        int number;
        if (NUDTextBox.Text != "") number = Convert.ToInt32(NUDTextBox.Text);
        else number = 0;
        if (number > minvalue)
            NUDTextBox.Text = Convert.ToString(number - 1); 
    }

    private void NUDTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {

        if (e.Key == Key.Up)
        {
            NUDButtonUP.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonUP, new object[] { true }); 
        }


        if (e.Key == Key.Down)
        {
            NUDButtonDown.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonDown, new object[] { true }); 
        }
    }

    private void NUDTextBox_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Up)
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonUP, new object[] { false });

        if (e.Key == Key.Down)
            typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(NUDButtonDown, new object[] { false });
    }

    private void NUDTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        int number = 0;
        if (NUDTextBox.Text!="")
            if (!int.TryParse(NUDTextBox.Text, out number)) NUDTextBox.Text = startvalue.ToString();
        if (number > maxvalue)  NUDTextBox.Text = maxvalue.ToString();
        if (number < minvalue) NUDTextBox.Text = minvalue.ToString();
        NUDTextBox.SelectionStart = NUDTextBox.Text.Length;

    }

}
Sonorx
quelle
2
Ist die Schriftart "Marlett" auf dem System des Benutzers garantiert vorhanden?
Qwertie
@Qwertie Es ist standardmäßig in Windows seit 3.11, AFAIR.
Spook
Dies ist eine gute Lösung und scheint auch mit UWP XAML zu funktionieren. Hatte gerade ein kleines Problem mit den PreviewKeyDown / PreviewKeyUP-Methoden.
Raddevus
10
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:numericButton2">


    <Style TargetType="{x:Type local:NumericUpDown}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:NumericUpDown}">              
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <RepeatButton Grid.Row="0" Name="Part_UpButton"/>
                            <ContentPresenter Grid.Row="1"></ContentPresenter>
                            <RepeatButton Grid.Row="2" Name="Part_DownButton"/>
                        </Grid>                  
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

    <Window x:Class="numericButton2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:numericButton2"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <local:NumericUpDown Margin="181,94,253,161" x:Name="ufuk" StepValue="4" Minimum="0" Maximum="20">            
            </local:NumericUpDown>
            <TextBlock Margin="211,112,279,0" Text="{Binding ElementName=ufuk, Path=Value}" Height="20" VerticalAlignment="Top"></TextBlock>
        </Grid>
    </Window>
public class NumericUpDown : Control
{
    private RepeatButton _UpButton;
    private RepeatButton _DownButton;
    public readonly static DependencyProperty MaximumProperty;
    public readonly static DependencyProperty MinimumProperty;
    public readonly static DependencyProperty ValueProperty;
    public readonly static DependencyProperty StepProperty;   
    static NumericUpDown()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown)));
        MaximumProperty = DependencyProperty.Register("Maximum", typeof(int), typeof(NumericUpDown), new UIPropertyMetadata(10));
        MinimumProperty = DependencyProperty.Register("Minimum", typeof(int), typeof(NumericUpDown), new UIPropertyMetadata(0));
        StepProperty = DependencyProperty.Register("StepValue", typeof(int), typeof(NumericUpDown), new FrameworkPropertyMetadata(5));
        ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(NumericUpDown), new FrameworkPropertyMetadata(0));
    }
    #region DpAccessior
    public int Maximum
    {
        get { return (int)GetValue(MaximumProperty); }
        set { SetValue(MaximumProperty, value); }
    }
    public int Minimum
    {
        get { return (int)GetValue(MinimumProperty); }
        set { SetValue(MinimumProperty, value); }
    }
    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetCurrentValue(ValueProperty, value); }
    }
    public int StepValue
    {
        get { return (int)GetValue(StepProperty); }
        set { SetValue(StepProperty, value); }
    }
    #endregion
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        _UpButton = Template.FindName("Part_UpButton", this) as RepeatButton;
        _DownButton = Template.FindName("Part_DownButton", this) as RepeatButton;
        _UpButton.Click += _UpButton_Click;
        _DownButton.Click += _DownButton_Click;
    }

    void _DownButton_Click(object sender, RoutedEventArgs e)
    {
        if (Value > Minimum)
        {
            Value -= StepValue;
            if (Value < Minimum)
                Value = Minimum;
        }
    }

    void _UpButton_Click(object sender, RoutedEventArgs e)
    {
        if (Value < Maximum)
        {
            Value += StepValue;
            if (Value > Maximum)
                Value = Maximum;
        }
    }

}
Vercin
quelle
9

Die gegebenen Antworten sind OK. Ich wollte jedoch, dass die Schaltflächen automatisch ausgeblendet werden, wenn die Maus das Steuerelement verlässt. Hier ist mein Code basierend auf der obigen Antwort von vercin :

Stil

<Style TargetType="{x:Type v:IntegerTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type v:IntegerTextBox}">
                    <Grid Background="Transparent">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <TextBox Name="tbmain" Grid.ColumnSpan="2" Grid.RowSpan="2"
                                 Text="{Binding Value, Mode=TwoWay, NotifyOnSourceUpdated=True, 
                            NotifyOnValidationError=True, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type v:IntegerTextBox}}}" 
                                               Style="{StaticResource ValidationStyle}" />
                        <RepeatButton Name="PART_UpButton" BorderThickness="0" Grid.Column="1" Grid.Row="0"
                                      Width="13" Background="Transparent">
                            <Path Fill="Black" Data="M 0 3 L 6 3 L 3 0 Z"/>
                        </RepeatButton>
                        <RepeatButton Name="PART_DownButton" BorderThickness="0" Grid.Column="1" Grid.Row="1"
                                      Width="13" Background="Transparent">
                            <Path Fill="Black" Data="M 0 0 L 3 3 L 6 0 Z"/>
                        </RepeatButton>

                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver"  Value="False">
                            <Setter Property="Visibility" TargetName="PART_UpButton" Value="Collapsed"/>
                            <Setter Property="Visibility" TargetName="PART_DownButton" Value="Collapsed"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Code

public partial class IntegerTextBox : UserControl
{
    public IntegerTextBox()
    {
        InitializeComponent();
    }

    public int Maximum
    {
        get { return (int)GetValue(MaximumProperty); }
        set { SetValue(MaximumProperty, value); }
    }
    public readonly static DependencyProperty MaximumProperty = DependencyProperty.Register(
        "Maximum", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(int.MaxValue));



    public int Minimum
    {
        get { return (int)GetValue(MinimumProperty); }
        set { SetValue(MinimumProperty, value); }
    }
    public readonly static DependencyProperty MinimumProperty = DependencyProperty.Register(
        "Minimum", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(int.MinValue));


    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetCurrentValue(ValueProperty, value); }
    }
    public readonly static DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(0, (o,e)=>
        {
            IntegerTextBox tb = (IntegerTextBox)o;
            tb.RaiseValueChangedEvent(e);
        }));

    public event EventHandler<DependencyPropertyChangedEventArgs> ValueChanged;
    private void RaiseValueChangedEvent(DependencyPropertyChangedEventArgs e)
    {
        ValueChanged?.Invoke(this, e);
    }


    public int Step
    {
        get { return (int)GetValue(StepProperty); }
        set { SetValue(StepProperty, value); }
    }
    public readonly static DependencyProperty StepProperty = DependencyProperty.Register(
        "Step", typeof(int), typeof(IntegerTextBox), new UIPropertyMetadata(1));



    RepeatButton _UpButton;
    RepeatButton _DownButton;
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        _UpButton = Template.FindName("PART_UpButton", this) as RepeatButton;
        _DownButton = Template.FindName("PART_DownButton", this) as RepeatButton;
        _UpButton.Click += btup_Click;
        _DownButton.Click += btdown_Click;
    }


    private void btup_Click(object sender, RoutedEventArgs e)
    {
        if (Value < Maximum)
        {
            Value += Step;
            if (Value > Maximum)
                Value = Maximum;
        }
    }

    private void btdown_Click(object sender, RoutedEventArgs e)
    {
        if (Value > Minimum)
        {
            Value -= Step;
            if (Value < Minimum)
                Value = Minimum;
        }
    }

}
Ron
quelle
Die beste Antwort hier. Richtige Verwendung der Abhängigkeitseigenschaften.
Konrad
5

Verwendung VerticalScrollBarmit dem TextBlockSteuerelement in WPF. Fügen Sie in Ihrem Code dahinter den folgenden Code hinzu:

Definieren Sie im Konstruktor einen Ereignishandler für die Bildlaufleiste:

scrollBar1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(scrollBar1_ValueChanged);
scrollBar1.Minimum = 0;
scrollBar1.Maximum = 1;
scrollBar1.SmallChange = 0.1;

Fügen Sie dann im Ereignishandler Folgendes hinzu:

void scrollBar1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    FteHolderText.Text = scrollBar1.Value.ToString();
}

Hier ist das Original-Snippet aus meinem Code ... nimm die notwendigen Änderungen vor .. :)

public NewProjectPlan()
{
    InitializeComponent();

    this.Loaded += new RoutedEventHandler(NewProjectPlan_Loaded);

    scrollBar1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(scrollBar1_ValueChanged);
    scrollBar1.Minimum = 0;
    scrollBar1.Maximum = 1;
    scrollBar1.SmallChange = 0.1;

    // etc...
}

void scrollBar1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    FteHolderText.Text = scrollBar1.Value.ToString();
}
Abhinav Wase
quelle
1
Ihre Lösung ist sehr intelligent, die Tasten arbeiten jedoch in umgekehrter Reihenfolge (Taste hoch verringert den Wert, Taste runter erhöht ihn). Ich habe einen anderen Thread gefunden, der möglicherweise zur Lösung dieses Problems beiträgt : stackoverflow.com/a/27246296/637968 - Drehen Sie einfach die Bildlaufleiste
Mike
5

Sie können das von mir als Teil der WPFControls- Bibliothek geschriebene NumericUpDown-Steuerelement für WPF verwenden.

Alex Titarenko
quelle
Eine nette kleine Bibliothek und zeigt, wie ein numerisches Auf / Ab-Steuerelement geschrieben werden sollte. Das einzige Problem, das ich hatte, war, die Steuerelementbaugruppe in der Demo erneut zu referenzieren und MSHTML von Nuget zu installieren. Vielen Dank!
SergeantKK
Großartige Arbeit mit der Bibliothek. Sehr hilfreich. Vielen Dank.
namg_engr
5

Entschuldigen Sie, dass Sie 9 Jahre lang Fragen beantwortet haben.

Ich habe die Antwort von @ Micheal befolgt und es funktioniert.

Ich mache es als UserControl, wo ich wie ein Controls-Element ziehen und ablegen kann. Ich verwende MaterialDesign Theme von Nuget, um das Chevron-Symbol und den Button-Ripple-Effekt zu erhalten.

Das laufende NumericUpDown von Micheal mit Modifikation wird wie folgt sein: -

Geben Sie hier die Bildbeschreibung ein

Der Code für die Benutzersteuerung: -

TemplateNumericUpDown.xaml

<UserControl x:Class="UserControlTemplate.TemplateNumericUpDown"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:UserControlTemplate"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             mc:Ignorable="d" MinHeight="48">
    <Grid Background="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="60"/>
        </Grid.ColumnDefinitions>
        <TextBox x:Name="txtNum" x:FieldModifier="private" Text="{Binding Path=NumValue}" TextChanged="TxtNum_TextChanged" FontSize="36" BorderThickness="0" VerticalAlignment="Center" Padding="5,0"/>
        <Grid Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="30*"/>
                <RowDefinition Height="30*"/>
            </Grid.RowDefinitions>
            <Grid Background="#FF673AB7">
                <Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
                    <materialDesign:PackIcon Kind="ChevronUp" Foreground="White" Height="32.941" Width="32"/>
                </Viewbox>
                <Button x:Name="cmdUp" x:FieldModifier="private" Click="CmdUp_Click" Height="Auto" BorderBrush="{x:Null}" Background="{x:Null}"/>
            </Grid>
            <Grid Grid.Row="1" Background="#FF673AB7">
                <Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
                    <materialDesign:PackIcon Kind="ChevronDown" Foreground="White" Height="32.942" Width="32"/>
                </Viewbox>
                <Button x:Name="cmdDown" x:FieldModifier="private" Click="CmdDown_Click" Height="Auto" BorderBrush="{x:Null}" Background="{x:Null}"/>
            </Grid>
        </Grid>
    </Grid>
</UserControl>

TemplateNumericUpDown.cs

using System.Windows;
using System.Windows.Controls;

namespace UserControlTemplate
{
    /// <summary>
    /// Interaction logic for TemplateNumericUpDown.xaml
    /// </summary>
    public partial class TemplateNumericUpDown : UserControl
    {
        private int _numValue = 0;
        public TemplateNumericUpDown()
        {
            InitializeComponent();
            txtNum.Text = _numValue.ToString();
        }
        public int NumValue
        {
            get { return _numValue; }
            set
            {
                if (value >= 0)
                {
                    _numValue = value;
                    txtNum.Text = value.ToString();
                }
            }
        }

        private void CmdUp_Click(object sender, RoutedEventArgs e)
        {
            NumValue++;
        }

        private void CmdDown_Click(object sender, RoutedEventArgs e)
        {
            NumValue--;
        }

        private void TxtNum_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (txtNum == null)
            {
                return;
            }

            if (!int.TryParse(txtNum.Text, out _numValue))
                txtNum.Text = _numValue.ToString();
        }
    }
}

Auf MyPageDesign.xaml wird durch Ziehen und Ablegen eine erstellte Benutzersteuerung erstellt <UserControlTemplate:TemplateNumericUpDown HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>

Geben Sie hier die Bildbeschreibung ein

Um den Wert aus der Vorlage zu erhalten, verwende ich

string Value1 = JournalNumStart.NumValue;
string Value2 = JournalNumEnd.NumValue;

Ich bin noch nicht in der Lage, die Höhe des Steuerelements basierend auf dem FontSize-Element zu binden. Daher habe ich die Schriftgröße meiner Seite manuell in der Benutzersteuerung festgelegt.

** Hinweis: - Ich habe den Namen "Archieve" in meinem Programm in "Archivieren" geändert =)

Luiey
quelle
Die Bedienbarkeit der Auf- / Ab-Tasten ist schrecklich: Sie sind zu klein, um praktisch zu sein. Sie müssen mindestens die gleiche Höhe wie das Textfeld haben (und quadratisch sein). Ich weiß, dass es etwas mehr Platz benötigt, aber es gibt Ihnen mindestens verwendbare Tasten. Ansonsten gibt es keinen Grund, sie überhaupt einzufügen.
Vincent
3

Ich habe eine naive Lösung, aber nützlich. Hier ist der Code:

<Grid Name="TVGrid" Background="#7F000000">  <ScrollBar Background="Black" Orientation="Vertical" Height="35" HorizontalAlignment="Left" Margin="215,254,0,0" Minimum="0" Maximum="10" LargeChange="10" Value="{Binding ElementName=channeltext2, Path=Text}" x:Name="scroll" VerticalAlignment="Top" Width="12" RenderTransformOrigin="0.5,0.5" ValueChanged="scroll_ValueChanged" >  
        <ScrollBar.RenderTransform>  
            <TransformGroup>  
                <ScaleTransform/>  
                <SkewTransform/>  
                <RotateTransform Angle="-180"/>  
                <TranslateTransform/>  
            </TransformGroup>  
        </ScrollBar.RenderTransform>  
    </ScrollBar>  
    <TextBox Name="channeltext" HorizontalContentAlignment="Center" FontSize="20"  Background="Black" Foreground="White" Height="35" HorizontalAlignment="Left" Margin="147,254,0,0" VerticalAlignment="Top" Width="53" Text="0" />  
    <TextBox Name="channeltext2" Visibility="Hidden" HorizontalContentAlignment="Center" FontSize="20"  Background="Black" Foreground="White" Height="35" HorizontalAlignment="Left" Margin="147,254,0,0" VerticalAlignment="Top" Width="53" Text="0" />  </Grid>  
Liron Harazi
quelle
3

Hier ist ein weiteres Open Source-Steuerelement mit vielen verschiedenen Eingabemethoden (Ziehen mit der Maus, Mausrad, Cursortasten, Bearbeiten von Textfeldern), das viele Datentypen und Anwendungsfälle unterstützt:

https://github.com/Dirkster99/NumericUpDownLib

user8276908
quelle
1

Nur eine pragmatische Probe:

- Klicken Sie mit der rechten Maustaste auf Ihr Projekt (unter Lösung) und wählen Sie "Nuget-Pakete verwalten ...".

-Im Menü klicken Durchsuchen Tab Suche nach „WPFToolkit“, wählen Sie „ Extended.Wpf.Toolkit

-Es installieren!

- Klicken Sie mit der rechten Maustaste in Ihre User Control Toolbox , wählen Sie "Tab hinzufügen " und nennen Sie sie "WPF Toolkit".

- Klicken Sie mit der rechten Maustaste auf die neue Registerkarte "WPF Toolkit" und wählen Sie "Elemente auswählen ...".

- Klicken Sie im Menü auf die Schaltfläche "Durchsuchen ...", suchen Sie nach dem DLL-Ordner für Nugets und wählen Sie alle aus. ...\packages\Extended.Wpf.Toolkit.3.5.0\lib\net40\*.dll"

Ignorieren Sie Warnungen zu einigen DLLs, die möglicherweise keine Benutzersteuerelemente enthalten!

Bereit :)

thewhiteambit
quelle
0

Gehen Sie zu NugetPackage Manager Ihres Projekts-> Suchen und suchen Sie nach mahApps.Metro -> installieren Sie das Paket in Ihrem Projekt. Sie sehen Referenz hinzugefügt: MahApps.Metro. Fügen Sie dann in Ihrem XAML-Code Folgendes hinzu:

"xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"

Wo Sie Ihr Objekt verwenden möchten, fügen Sie hinzu:

<mah:NumericUpDown x:Name="NumericUpDown" ... /> 

Genießen Sie die volle Erweiterbarkeit des Objekts (Bindungen, Trigger usw.).

Andre
quelle