Di mana kontrol Numeric UpDown WPF?

124

Masuk ke proyek WPF serius pertama. Sepertinya ada banyak kontrol dasar yang hilang. Secara khusus, saya mencari kontrol Numeric UpDown. Apakah ada rilis band yang saya lewatkan? Benar-benar tidak ingin menulis kendali saya sendiri.

Saya tidak ingin menggunakan WindowsFormHost dan memasang ctl WinForm di atasnya. Saya ingin ini menjadi WPF sepenuhnya tanpa sampah lama.

Terima kasih

AngryHacker
sumber
4
Toolkit WPF yang Diperluas memiliki satu: NumericUpDown ! teks alt
Eduardo Molteni
21
Komentar tunggal ini adalah pendorong lalu lintas terbesar ke blog saya sepanjang masa. Bahkan sampai hari ini. Kocak.
Kevin Moore
1
kemungkinan duplikat setara Good NumericUpDown di WPF?
J c
3
Pertanyaannya adalah "di mana kontrol UpDown numerik WPF". Tak satu pun dari jawaban ini menjawab pertanyaan itu. Saya mengharapkan jenis jawaban dalam bentuk "mereka memutuskan untuk menyingkirkannya di wpf karena ...". Saya tidak tahu jawaban ini, namun
Assimilater
2
WPF Toolkit membuat lebih banyak masalah daripada memecahkannya, ini mengandung cukup banyak bug yang jelas; dan tidak ada kontrol NumericUpDown dari Microsoft ... sih, apakah WPF masih hidup lagi?
j00hi

Jawaban:

48

Cukup gunakan IntegerUpDownkontrol di xtended wpf toolkit Anda dapat menggunakannya seperti ini:

  1. Tambahkan ke XAML Anda namespace berikut:

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

  2. Di XAML Anda di mana Anda ingin menggunakan kontrol:

    <xctk:IntegerUpDown Name="myUpDownControl" />

Ditumpuk
sumber
6
Bagi mereka yang bertanya-tanya / tidak nyaman dengan kontrol sumber tertutup pihak ketiga, perhatikan bahwa versi gratis pustaka ini dirilis di bawah Lisensi Publik Microsoft, yang pada dasarnya berarti Anda mendapatkan kode sumber lengkap di belakangnya (baca teks lisensi lengkap untuk detailnya). Kontrol UpDown adalah bagian dari versi gratis. Ada juga versi berbayar dari perpustakaan yang berisi lebih banyak kontrol / tema.
jrh
Apakah ada cara agar kontrol WPF kustom ini muncul di VS Toolbox demi kenyamanan? Saya tidak dapat menemukannya di 'Alat -> Pilih Item Kotak Alat'.
penerbang
2
Perlu dicatat bahwa mulai dengan versi v3.7.0, versi open source dari wpftoolkit disediakan di bawah lisensi non-komersial berpemilik daripada MS-PL ( referensi )
Jordoff
46

Saya membuatnya sendiri;

yang 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>

dan kode di belakangnya

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
sumber
acara textChanged tidak ada untuk kotak teks di WPF .net 4
AliR
Metode ini memiliki beberapa batasan, 1) TextBox tidak meregang secara horizontal dengan kontrol seperti yang dilakukan Winforms, dan yang kurang penting, 2) tidak seperti Winforms NumericUpDown, kontrol ini memungkinkan peregangan vertikal, yang tidak berbahaya tetapi terlihat agak konyol . Perhatikan bahwa solusi dalam jawaban Sonorx tidak memiliki masalah ini.
jrh
2
NumValue harus menjadi properti ketergantungan untuk memungkinkan pengikatan, juga properti lain seperti MinValue dan MaxValue akan menyenangkan.
Konrad
Solusi ini timpang. Ini adalah kontrol khusus tanpa dukungan untuk pengikatan data wpf, acara yang dirutekan, dan perintah.
Xam
18

Ini adalah contoh UserControl saya sendiri dengan tombol Naik dan Turun.

Kode Xaml:

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

Dan kodenya:

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
sumber
2
Apakah font "Marlett" dijamin ada di sistem pengguna?
Qwertie
@Qwertie Ini secara default di Windows sejak 3.11, AFAIR.
Spook
Ini adalah solusi yang bagus dan sepertinya bekerja dengan UWP XAML juga. Baru saja mengalami sedikit masalah dengan metode PreviewKeyDown / PreviewKeyUP.
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
sumber
9

Jawaban yang diberikan OK. Namun, saya ingin tombolnya otomatis bersembunyi, saat mouse lepas kendali. Ini kode saya berdasarkan jawaban vercin di atas:

Gaya

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

Kode

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
sumber
Jawaban terbaik disini. Penggunaan properti ketergantungan yang tepat.
Konrad
5

Gunakan VerticalScrollBardenganTextBlock kontrol di WPF. Di belakang kode Anda, tambahkan kode berikut:

Dalam konstruktor, tentukan penangan kejadian untuk scrollbar:

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

Kemudian di event handler, tambahkan:

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

Ini cuplikan asli dari kode saya ... buat perubahan yang diperlukan .. :)

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
sumber
1
solusi Anda sangat cerdas, namun tombolnya bekerja dalam urutan terbalik (tombol naik menurunkan nilainya sementara tombol turun meningkatkannya). Saya telah menemukan utas lain yang mungkin dapat membantu untuk memecahkan masalah itu: stackoverflow.com/a/27246296/637968 - putar saja bilah gulir
Mike
5

Anda dapat menggunakan kontrol NumericUpDown untuk WPF yang saya tulis sebagai bagian dari pustaka WPFControls .

Alex Titarenko
sumber
Sebuah perpustakaan kecil yang bagus dan menunjukkan bagaimana kontrol atas / bawah numerik harus ditulis. Satu-satunya masalah yang saya hadapi adalah harus mereferensikan rakitan kontrol di demo dan menginstal MSHTML dari nuget. Terima kasih!
sergeantKK
Kerja bagus dengan perpustakaan. Sangat berguna. Terima kasih.
namg_engr
5

Minta maaf karena terus menjawab pertanyaan 9 tahun.

Saya telah mengikuti jawaban @ Micheal dan berhasil.

Saya melakukannya sebagai UserControl di mana saya dapat menarik dan melepas seperti elemen Kontrol. Saya menggunakan Tema MaterialDesign dari Nuget untuk mendapatkan ikon Chevron dan efek riak tombol.

NumericUpDown yang sedang berjalan dari Micheal dengan modifikasi akan seperti di bawah ini: -

masukkan deskripsi gambar di sini

Kode untuk kontrol pengguna: -

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

Pada MyPageDesign.xaml, drag and drop akan membuat usercontrol <UserControlTemplate:TemplateNumericUpDown HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>

masukkan deskripsi gambar di sini

Untuk mendapatkan nilai dari template tersebut, saya gunakan

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

Saya belum memiliki keterampilan yang baik untuk mengikat Ketinggian kontrol berdasarkan elemen FontSize, jadi saya mengatur ukuran font dari halaman saya secara manual di usercontrol.

** Catatan: - Saya telah mengubah nama "Arsip" menjadi Arsip di program saya =)

Luiey
sumber
Kegunaan tombol atas / bawah sangat buruk: mereka terlalu kecil untuk digunakan. Mereka harus SETIDAKNYA tingginya sama dengan kotak teks (dan berbentuk persegi). Saya tahu ini membutuhkan lebih banyak ruang, tetapi ini memberi Anda SETIDAKNYA tombol yang dapat digunakan. Jika tidak, tidak ada alasan untuk memasukkannya sama sekali.
Vincent
3

Saya memiliki solusi yang naif tetapi bermanfaat. Ini kodenya:

<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
sumber
3

Berikut adalah kontrol open source lain yang memiliki banyak metode masukan berbeda (seret mouse, roda mouse, tombol kursor, pengeditan kotak teks), mendukung banyak tipe data dan kasus penggunaan:

https://github.com/Dirkster99/NumericUpDownLib

pengguna8276908
sumber
1

Hanya sampel pragmatis untuk dilakukan:

-Klik kanan Proyek Anda (di bawah Solusi), pilih "Kelola Paket nuget ..."

-Dalam Menu klik Browse Tab cari "wpftoolkit", pilih " Extended.Wpf.Toolkit"

-Instal itu!

-Klik kanan di Kotak Alat Kontrol Pengguna Anda , pilih "Tambah Tab .." dan beri nama "Alat WPF"

-Klik kanan pada Tab "WPF Toolkit" baru, pilih "Pilih item ..."

-Dalam Menu klik tombol "Browse ...", cari folder DLL nugets, pilih semua " ...\packages\Extended.Wpf.Toolkit.3.5.0\lib\net40\*.dll"

Abaikan Peringatan tentang beberapa DLL mungkin tidak berisi kontrol pengguna!

Siap :)

thewhiteambit
sumber
0

Pergi ke NugetPackage manager proyek Anda-> Jelajahi dan cari mahApps.Metro -> instal paket ke proyek Anda. Anda akan melihat Referensi ditambahkan: MahApps.Metro. Kemudian di dalam kode XAML Anda tambahkan:

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

Di mana Anda ingin menggunakan objek Anda tambahkan:

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

Nikmati ekstensibilitas penuh objek (Bindings, trigger, dan sebagainya ...).

Andre
sumber