Điều khiển WPF Numeric UpDown ở đâu?


124

Tham gia vào dự án WPF nghiêm túc đầu tiên. Có vẻ như có rất nhiều điều khiển cơ bản bị thiếu. Cụ thể, tôi đang tìm kiếm điều khiển Numeric UpDown. Có một bản phát hành ngoài ban nhạc mà tôi đã bỏ lỡ không? Thực sự không cảm thấy muốn viết kiểm soát của riêng tôi.

Tôi không muốn sử dụng WindowsFormHost và mở ctl WinForm trên đó. Tôi muốn nó hoàn toàn là WPF mà không có bất kỳ rác kế thừa nào.

Cảm ơn


4
Bộ công cụ WPF mở rộng có một: NumericUpDown ! văn bản thay thế
Eduardo Molteni

21
Nhận xét duy nhất này là động lực lớn nhất của lưu lượng truy cập vào blog của tôi mọi thời đại. Ngay cả cho đến ngày nay. Vui nhộn.
Kevin Moore


3
Câu hỏi đặt ra là "điều khiển UpDown số WPF ở đâu". Không câu trả lời nào trong số này trả lời câu hỏi đó. Tôi sẽ mong đợi câu trả lời có dạng "họ quyết định loại bỏ nó trong wpf vì ...". Tôi không biết câu trả lời này, tuy nhiên
Assimilater

2
Bộ công cụ WPF giải quyết được nhiều vấn đề hơn so với cách giải quyết, nó chứa một số lỗi rõ ràng; và không có quyền kiểm soát NumericUpDown từ Microsoft ... địa ngục, liệu WPF có còn sống nữa không?
j00hi

Câu trả lời:


48

Chỉ cần sử dụng IntegerUpDownđiều khiển trong bộ công cụ xtended wpf Bạn có thể sử dụng nó như sau:

  1. Thêm vào XAML của bạn không gian tên sau:

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

  2. Trong XAML của bạn, nơi bạn muốn sử dụng điều khiển:

    <xctk:IntegerUpDown Name="myUpDownControl" />


6
Đối với những người thắc mắc / không thoải mái với các điều khiển nguồn đóng của bên thứ ba, hãy lưu ý rằng phiên bản miễn phí của thư viện này được phát hành theo Giấy phép Công cộng của Microsoft, về cơ bản có nghĩa là bạn nhận được toàn bộ mã nguồn đằng sau nó (đọc toàn bộ văn bản giấy phép để biết chi tiết). Các điều khiển UpDown là một phần của phiên bản miễn phí. Ngoài ra còn có một phiên bản trả phí của thư viện chứa nhiều điều khiển / chủ đề hơn.
jrh 13/11/17

Có cách nào để các điều khiển WPF tùy chỉnh này hiển thị trong Hộp công cụ VS cho thuận tiện không? Tôi không thể tìm thấy chúng trong 'Công cụ -> Chọn mục Hộp công cụ'.
aviator

2
Cần lưu ý rằng bắt đầu từ phiên bản v3.7.0, phiên bản nguồn mở của wpftoolkit được cung cấp theo giấy phép phi thương mại độc quyền chứ không phải MS-PL ( tham khảo )
Jordoff

46

Tôi đã làm của riêng tôi;

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>

và mã đằng sau

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

sự kiện textChanged không tồn tại cho hộp văn bản trong WPF .net 4
AliR

Phương pháp này có một số hạn chế, 1) TextBox không kéo dài theo chiều ngang với điều khiển như Winforms, và ít quan trọng hơn, 2) không giống như Winforms NumericUpDown, điều khiển này cho phép kéo dài theo chiều dọc, điều này vô hại nhưng nó trông hơi ngớ ngẩn . Lưu ý rằng giải pháp trong câu trả lời của Sonorx không có những vấn đề này.
jrh

2
NumValue nên là một thuộc tính phụ thuộc để cho phép ràng buộc, các thuộc tính khác như MinValue và MaxValue sẽ rất tốt.
Konrad

Giải pháp này là khập khiễng. Đó là điều khiển tùy chỉnh không hỗ trợ ràng buộc dữ liệu wpf, các sự kiện và lệnh được định tuyến.
Xam

18

Đây là ví dụ về UserControl của riêng tôi với tính năng bắt phím Lên và Xuống.

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

Và mã:

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
Phông chữ "Marlett" có được đảm bảo tồn tại trên hệ thống của người dùng không?
Qwertie

@Qwertie Nó là mặc định trong Windows kể từ 3.11, AFAIR.
Spook

Đây là một giải pháp tốt và dường như cũng hoạt động với UWP XAML. Chỉ có một chút vấn đề với các phương thức PreviewKeyDown / PreviewKeyUP.
raddevus 14/09/16

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

Các câu trả lời được đưa ra là OK. Tuy nhiên, tôi muốn các nút tự động ẩn khi chuột rời khỏi điều khiển. Đây là mã của tôi dựa trên câu trả lời vercin ở trên:

Phong cách

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

}

Câu trả lời tốt nhất ở đây. Sử dụng hợp lý các thuộc tính phụ thuộc.
Konrad

5

Sử dụng VerticalScrollBarvới TextBlockđiều khiển trong WPF. Trong mã phía sau của bạn, hãy thêm mã sau:

Trong hàm tạo, xác định một trình xử lý sự kiện cho thanh cuộn:

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

Sau đó, trong trình xử lý sự kiện, hãy thêm:

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

Đây là đoạn mã gốc từ mã của tôi ... thực hiện các thay đổi cần thiết .. :)

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
giải pháp của bạn rất thông minh, tuy nhiên các nút đang hoạt động theo thứ tự ngược lại (nút lên giảm giá trị trong khi nút xuống tăng giá trị). Tôi đã tìm thấy một chủ đề mà có thể là một trợ giúp để giải quyết vấn đề đó: stackoverflow.com/a/27246296/637968 - chỉ cần xoay thanh cuộn
Mike

5

Bạn có thể sử dụng điều khiển NumericUpDown cho WPF do tôi viết như một phần của thư viện WPFControls .


Một thư viện nhỏ đẹp và cho thấy cách viết điều khiển lên / xuống bằng số. Vấn đề duy nhất tôi gặp phải là phải tham chiếu lại cụm điều khiển trong bản demo và cài đặt MSHTML từ nuget. Cảm ơn!
sergeantKK

Công việc tuyệt vời với thư viện. Rất hữu ích. Cảm ơn.
namg_engr 23/03/18

5

Xin lỗi vì đã tiếp tục trả lời các câu hỏi 9 năm.

Tôi đã làm theo câu trả lời của @ Micheal và nó hoạt động.

Tôi làm điều đó với tư cách là UserControl, nơi tôi có thể kéo và thả giống như các phần tử Controls. Tôi sử dụng Chủ đề MaterialDesign từ Nuget để lấy biểu tượng Chevron và hiệu ứng gợn nút.

NumericUpDown đang chạy từ Micheal với sửa đổi sẽ như sau: -

nhập mô tả hình ảnh ở đây

Mã kiểm soát người dùng: -

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

Trên MyPageDesign.xaml, kéo và thả điều khiển người dùng đã tạo sẽ có <UserControlTemplate:TemplateNumericUpDown HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>

nhập mô tả hình ảnh ở đây

Để lấy giá trị từ mẫu, tôi sử dụng

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

Tôi chưa có kỹ năng tốt để ràng buộc Chiều cao của điều khiển dựa trên phần tử FontSize, vì vậy tôi đặt kích thước phông chữ từ trang của mình theo cách thủ công trong điều khiển người dùng.

** Lưu ý: - Tôi đã thay đổi tên "Lưu trữ" thành Lưu trữ trên chương trình của mình =)


Khả năng sử dụng của các nút lên / xuống rất kinh khủng: chúng quá nhỏ để tiện dụng. Chúng phải có chiều cao ÍT NHẤT bằng chiều cao của hộp văn bản (và là hình vuông). Tôi biết nó tốn nhiều không gian hơn một chút, nhưng nó cung cấp cho bạn ÍT NHẤT các nút có thể sử dụng. Nếu không thì không có lý do gì để chèn chúng cả.
Vincent

3

Tôi có một giải pháp ngây thơ nhưng hữu ích. Đây là mã:

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


1

Chỉ là một mẫu thực dụng để làm:

-Nhấp chuột phải vào Dự án của bạn (trong Giải pháp), chọn "Quản lý Gói nuget ..."

-Trong Menu, nhấp vào Duyệt tab tìm kiếm "wpftoolkit", chọn " Extended.Wpf.Toolkit"

-Cài đặt nó!

-Nhấp chuột phải vào Hộp công cụ điều khiển người dùng của bạn , chọn "Thêm tab .." và đặt tên là "Bộ công cụ WPF"

-Nhấp chuột phải vào Tab "Bộ công cụ WPF" mới, chọn "Chọn mục ..."

-Trong Menu bấm vào nút "Browse ...", tìm thư mục DLL cốm, chọn tất cả " ...\packages\Extended.Wpf.Toolkit.3.5.0\lib\net40\*.dll"

Bỏ qua Cảnh báo về một số DLL có thể không chứa các điều khiển của người dùng!

Sẵn sàng :)


0

Vào trình quản lý NugetPackage của bạn dự án-> Duyệt và tìm kiếm mahApps.Metro -> cài đặt gói vào dự án của bạn. Bạn sẽ thấy Tài liệu tham khảo được thêm vào: MahApps.Metro. Sau đó, trong mã XAML của bạn thêm:

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

Nơi bạn muốn sử dụng đối tượng của mình, hãy thêm:

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

Tận hưởng toàn bộ khả năng mở rộng của đối tượng (Ràng buộc, trình kích hoạt, v.v.).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.