WPF न्यूमेरिक अपडाउन कंट्रोल कहाँ है?


124

पहले गंभीर WPF प्रोजेक्ट में आना। ऐसा लगता है कि फ्लैट से बहुत सारे बुनियादी नियंत्रण गायब हैं। विशेष रूप से, मैं न्यूमेरिक अपडाउन कंट्रोल की तलाश में हूं। क्या बैंड रिलीज़ से बाहर था जिसे मैंने याद किया? वास्तव में मेरा खुद का नियंत्रण लिखने का मन नहीं है।

मैं WindowsFormHost का उपयोग नहीं करना चाहता और इस पर एक WinForm ctl को बंद कर दूं। मैं चाहता हूं कि यह पूरी तरह से बिना किसी विरासत के रद्दी के WPF हो।

धन्यवाद


4
विस्तृत WPF टूलकिट में एक है: NumericUpDown ! ऑल्ट टेक्स्ट
एडुआर्डो मोल्टनी

20
यह एकल टिप्पणी मेरे ब्लॉग के लिए यातायात का सबसे बड़ा चालक है। यहां तक ​​कि आज तक। प्रफुल्लित।
केविन मूर


3
सवाल यह है कि "WPF संख्यात्मक अपडाउन कंट्रोल कहां है"। इनमें से कोई भी उत्तर उस प्रश्न का उत्तर नहीं देता है। मुझे उम्मीद है कि इस तरह के उत्तर के रूप में "वे wpf में इससे छुटकारा पाने का फैसला करते हैं क्योंकि ..."। मैं इस जवाब को नहीं जानता, हालांकि
एसिमिलाटर

2
WPF टूलकिट हल करने की तुलना में अधिक समस्याओं का रास्ता बनाता है, इसमें कुछ स्पष्ट कीड़े होते हैं; और Microsoft से कोई भी NumericUpDown नियंत्रण नहीं है ... नरक, क्या WPF अब भी जीवित है?
j00hi

जवाबों:


48

बस xtended wpf टूलकिटIntegerUpDown में नियंत्रण का उपयोग करें आप इसे इस तरह से उपयोग कर सकते हैं:

  1. अपने XAML में निम्नलिखित नामस्थान जोड़ें:

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

  2. अपने XAML में जहां आप नियंत्रण का उपयोग करना चाहते हैं:

    <xctk:IntegerUpDown Name="myUpDownControl" />


6
तीसरे पक्ष के बंद स्रोत नियंत्रणों के बारे में सोच रहे लोगों के लिए / आराम से नहीं, ध्यान दें कि इस लाइब्रेरी का मुफ्त संस्करण Microsoft सार्वजनिक लाइसेंस के तहत जारी किया गया है, जिसका मूल अर्थ है कि आपको इसके पीछे पूर्ण स्रोत कोड मिलता है (विवरण के लिए पूर्ण लाइसेंस पाठ पढ़ें)। UpDown नियंत्रण नि: शुल्क संस्करण का हिस्सा हैं। पुस्तकालय का एक भुगतान किया संस्करण भी है जिसमें बहुत अधिक नियंत्रण / थीम शामिल हैं।
jrh

सुविधा के लिए वीएस टूलबॉक्स में इन कस्टम WPF नियंत्रणों को दिखाने का कोई तरीका है? मैं उन्हें 'टूल्स -> टूलबॉक्स आइटम चुनें' के तहत नहीं मिला।
एविएटर

2
यह ध्यान दिया जाना चाहिए कि संस्करण v3.7.0 से शुरू होकर, wpftoolkit का खुला स्रोत संस्करण एमएस-पीएल ( संदर्भ ) के बजाय एक मालिकाना गैर-वाणिज्यिक लाइसेंस के तहत प्रदान किया गया है
जॉर्डनऑफ

46

मैंने अपना बनाया;

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>

और पीछे कोड

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

textChanged घटना WPF .net 4 में एक पाठ बॉक्स के लिए मौजूद नहीं है
अलीआर

इस पद्धति की कुछ सीमाएँ हैं, 1) टेक्स्टबॉक्स क्षैतिज रूप से नियंत्रण के साथ खिंचाव नहीं करता है जैसे कि Winforms एक करता है, और कम महत्वपूर्ण बात, 2) Winforms NumericUpDown के विपरीत, यह नियंत्रण ऊर्ध्वाधर खिंचाव की अनुमति देता है, जो कि हानिकारक है लेकिन यह थोड़ा मूर्खतापूर्ण दिखता है । ध्यान दें कि सोनोरक्स के उत्तर में समाधान में ये मुद्दे नहीं हैं।
जूनियर

2
NumValue बाइंडिंग की अनुमति देने के लिए एक निर्भरता गुण होना चाहिए, MinValue और MaxValue जैसे अन्य गुण भी अच्छे होंगे।
कोनराड

यह समाधान लंगड़ा है। यह wpf डेटा बाइंडिंग, रूट की गई घटनाओं और आदेशों के लिए बिना किसी समर्थन के एक कस्टम नियंत्रण है।
XAM

18

यह ऊपर और नीचे कुंजी पकड़ने के साथ मेरे खुद के UserControl का उदाहरण है।

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>

और कोड:

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;

    }

}

2
क्या उपयोगकर्ता के सिस्टम पर मौजूद "Marlett" फ़ॉन्ट की गारंटी है?
क्वर्टी

@Qwertie यह विंडोज में डिफ़ॉल्ट रूप से 3.11 से है, AFAIR।
भूत

यह एक अच्छा समाधान है और UWP XAML के साथ भी काम करता है। बस PreviewKeyDown / PreviewKeyUP विधियों के साथ थोड़ा मुद्दा था।
राडदेवस

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

}

9

दिए गए उत्तर ठीक हैं। हालाँकि, मैं चाहता था कि बटन ऑटो छिपाएं, जब माउस नियंत्रण छोड़ देता है। यहाँ मेरा कोड वर्सीन पर आधारित है ऊपर दिए उत्तर है:

अंदाज

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

कोड

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

}

यहाँ सबसे अच्छा जवाब। निर्भरता गुणों का उचित उपयोग।
कोनराड

5

WPF में नियंत्रण के VerticalScrollBarसाथ प्रयोग करें TextBlock। अपने कोड के पीछे, निम्नलिखित कोड जोड़ें:

कंस्ट्रक्टर में, स्क्रॉलबार के लिए ईवेंट हैंडलर परिभाषित करें:

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

फिर ईवेंट हैंडलर में, जोड़ें:

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

यहाँ मेरे कोड से मूल स्निपेट है ... आवश्यक परिवर्तन करें .. :)

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

1
आपका समाधान बहुत स्मार्ट है, हालांकि बटन रिवर्स ऑर्डर में काम कर रहे हैं (बटन अप मूल्य में कमी आती है जबकि बटन डाउन इसे बढ़ाता है)। मुझे एक और धागा मिला है जो उस मुद्दे को हल करने में मददगार हो सकता है: stackoverflow.com/a/27246296/637968 - सिर्फ स्क्रॉलबार को घुमाएं
माइक

5

आप WPFControls लाइब्रेरी के एक भाग के रूप में मेरे द्वारा लिखे गए WPF के लिए NumericUpDown नियंत्रण का उपयोग कर सकते हैं ।


एक अच्छा सा पुस्तकालय और दिखाता है कि एक संख्यात्मक अप / डाउन नियंत्रण कैसे लिखा जाना चाहिए। केवल समस्या जो मुझे थी, डेमो में नियंत्रण असेंबली को फिर से संदर्भित करने और MSHTML को nuget से स्थापित करने के लिए। धन्यवाद!
सार्जेंटकेके

पुस्तकालय के साथ बहुत अच्छा काम। बहुत उपयोगी। धन्यवाद।
namg_engr

5

9 साल के सवालों के जवाब देने के लिए माफी मांगें।

मेरे पास @ मिकाइल के उत्तर का अनुसरण है और यह काम करता है।

मैं इसे UserControl के रूप में करता हूं, जहां मैं कंट्रोल तत्वों की तरह ड्रैग और ड्रॉप कर सकता हूं। मैं शेवरॉन आइकन और बटन लहर प्रभाव प्राप्त करने के लिए Nuget से MaterialDesign थीम का उपयोग करता हूं।

संशोधन के साथ माइकल से चलने वाला न्यूमेरिकडाउन निम्नानुसार होगा: -

यहाँ छवि विवरण दर्ज करें

उपयोगकर्ता नियंत्रण के लिए कोड: -

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

MyPageDesign.xaml पर, खींचें और ड्रॉप किए गए उपयोगकर्ता कॉन्ट्रैक्टर होंगे <UserControlTemplate:TemplateNumericUpDown HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>

यहाँ छवि विवरण दर्ज करें

टेम्पलेट से मूल्य प्राप्त करने के लिए, मैं उपयोग करता हूं

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

मैं FontSize तत्व से आधारित नियंत्रण की ऊंचाई को बांधने के लिए अभी तक अच्छे कौशल में नहीं हूं, इसलिए मैंने अपने पेज से usercontrol में मैन्युअल रूप से फ़ॉन्ट सेट किया है।

** नोट: - मैंने अपने कार्यक्रम में पुरालेख में "आर्काइव" नाम बदल दिया है =)


अप / डाउन बटन की प्रयोज्यता भयानक है: वे काम में आने के लिए बहुत छोटे हैं। उन्हें टेक्स्ट बॉक्स (और चौकोर) के रूप में AT LEAST समान ऊंचाई का होना चाहिए। मुझे पता है कि यह थोड़ा अधिक स्थान लेता है, लेकिन यह आपको कम से कम प्रयोग करने योग्य बटन देता है। अन्यथा उन्हें 'एम' डालने का कोई कारण नहीं है।
विन्सेन्ट

3

मेरे पास एक भोला समाधान है लेकिन उपयोगी है। यहाँ कोड है:

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

3

यहां एक और खुला स्रोत नियंत्रण है जिसमें कई अलग-अलग इनपुट विधियां हैं (माउस ड्रैग, माउस व्हील, कर्सर कुंजियां, टेक्स्टबॉक्स संपादन), कई डेटा प्रकारों का समर्थन करता है और मामलों का उपयोग करता है:

https://github.com/Dirkster99/NumericUpDownLib


1

बस नमूना करने के लिए एक व्यावहारिक:

-अपने प्रोजेक्ट पर क्लिक करें (समाधान के तहत), "नगेट पैकेज प्रबंधित करें ..." चुनें

मेनू में "wpftoolkit" के लिए टैब खोज ब्राउज़ करें पर क्लिक करें , " Extended.Wpf.Toolkit"

-इसे स्थापित करो!

-अपने यूजर कंट्रोल टूलबॉक्स में क्लिक करें , "टैब जोड़ें .." चुनें और इसे "WPF टूलकिट" नाम दें

नए "WPF टूलकिट" टैब पर क्लिक करें, "आइटम चुनें ..." चुनें

मेनू में "ब्राउज़ करें ..." बटन पर क्लिक करें, नगेट्स DLL फ़ोल्डर की तलाश करें, सभी का चयन करें "...\packages\Extended.Wpf.Toolkit.3.5.0\lib\net40\*.dll "

कुछ DLL के बारे में चेतावनी को अनदेखा करें जिसमें उपयोगकर्ता नियंत्रण नहीं हो सकता है!

तैयार :)


0

आप परियोजना के NugetPackage प्रबंधक पर जाएं-> ब्राउज़ करें और mahApps के लिए खोजें। Metro -> आप परियोजना में पैकेज स्थापित करें। आपको संदर्भ जोड़ा जाएगा: MahApps.Metro। फिर आप में XAML कोड जोड़ें:

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

जहाँ आप अपने ऑब्जेक्ट ऐड का उपयोग करना चाहते हैं:

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

वस्तु की पूरी विस्तारशीलता का आनंद लें (बाइंडिंग, ट्रिगर्स और इसी तरह ...)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.