WPF Numeric UpDown 컨트롤은 어디에 있습니까?


124

첫 번째 심각한 WPF 프로젝트 시작. 기본 컨트롤이 많이 누락 된 것 같습니다. 특히 Numeric UpDown 컨트롤을 찾고 있습니다. 내가 놓친 대역 외 릴리스가 있었습니까? 내 자신의 컨트롤을 작성하고 싶지 않습니다.

WindowsFormHost를 사용하고 WinForm ctl을 사용하고 싶지 않습니다. 레거시 정크없이 완전히 WPF가되기를 바랍니다.

감사


4
Extented WPF Toolkit에는 NumericUpDown ! 대체 텍스트
Eduardo Molteni

21
이 단일 댓글은 항상 내 블로그 트래픽의 가장 큰 원동력입니다. 오늘날까지도. 재밌 네요.
케빈 무어


3
질문은 "WPF 숫자 UpDown 컨트롤은 어디에 있습니까?"입니다. 이 답변 중 어느 것도 그 질문에 대답하지 않습니다. 나는 그 종류의 대답이 "wpf에서 그것을 제거하기로 결정했다. 나는 그러나,이 답을 알고하지 않습니다
Assimilater

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 Public License에 따라 릴리스되므로 기본적으로 전체 소스 코드를 얻을 수 있습니다 (자세한 내용은 전체 라이선스 텍스트 참조). UpDown 컨트롤은 무료 버전의 일부입니다. 더 많은 컨트롤 / 테마가 포함 된 유료 버전의 라이브러리도 있습니다.
jrh

편의를 위해 이러한 사용자 지정 WPF 컨트롤을 VS 도구 상자에 표시하는 방법이 있습니까? '도구-> 도구 상자 항목 선택'에서 찾을 수 없습니다.
비행가

2
버전 v3.7.0부터 wpftoolkit의 오픈 소스 버전은 MS-PL ( 참조 )이 아닌 독점적 비상업적 라이선스로 제공됩니다
Jordoff

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의 텍스트 상자에 존재하지 않습니다
AliR

이 방법에는 몇 가지 제한 사항이 있습니다. 1) TextBox가 Winforms와 같은 컨트롤을 사용하여 수평으로 늘어나지 않으며 덜 중요합니다 .2) Winforms NumericUpDown과 달리이 컨트롤은 수직 확장을 허용합니다. 이는 무해하지만 약간 어리석은 것처럼 보입니다 . Sonorx의 답변 에있는 솔루션 에는 이러한 문제가 없습니다.
jrh

2
NumValue는 바인딩을 허용하는 종속성 속성이어야하며 MinValue 및 MaxValue와 같은 다른 속성도 좋을 것입니다.
Konrad

이 솔루션은 절름발이입니다. wpf 데이터 바인딩, 라우팅 된 이벤트 및 명령을 지원하지 않는 사용자 지정 컨트롤입니다.
Xam

18

이것은 Up 및 Down 키 캐치를 사용하는 내 자신의 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 2013

@Qwertie 3.11, AFAIR 이후 Windows에서는 기본적으로 사용됩니다.
Spook

이것은 좋은 솔루션이며 UWP XAML에서도 작동하는 것 같습니다. 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;
        }
    }

}

9

주어진 대답은 괜찮습니다. 그러나 마우스가 컨트롤을 떠날 때 버튼이 자동으로 숨겨지기를 원했습니다. 위의 vercin 답변을 기반으로 한 내 코드는 다음과 같습니다 .

스타일

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

}

여기에 가장 좋은 대답입니다. 종속성 속성의 적절한 사용.
Konrad

5

WPF VerticalScrollBarTextBlock컨트롤 과 함께 사용 합니다 . 코드 뒤에 다음 코드를 추가하십시오.

생성자에서 스크롤바에 대한 이벤트 핸들러를 정의합니다.

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 컨트롤을 사용할 수 있습니다 .


멋진 작은 라이브러리이며 숫자 업 / 다운 컨트롤을 작성하는 방법을 보여줍니다. 내가 가진 유일한 문제는 데모에서 컨트롤 어셈블리를 다시 참조하고 nuget에서 MSHTML을 설치해야한다는 것입니다. 감사!
sergeantKK

도서관에서 잘하셨습니다. 굉장히 유용하다. 감사.
namg_engr

5

9 년의 질문에 계속 답 해주셔서 사과드립니다.

@Micheal의 답변을 따르고 작동합니다.

Controls 요소처럼 끌어서 놓을 수있는 UserControl로 수행합니다. Nuget의 MaterialDesign Theme를 사용하여 Chevron 아이콘과 버튼 파급 효과를 얻습니다.

Micheal에서 수정 된 NumericUpDown은 다음과 같습니다.

여기에 이미지 설명 입력

사용자 제어를위한 코드 :-

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에서 만든 usercontrol을 끌어서 놓기하면 <UserControlTemplate:TemplateNumericUpDown HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100"/>

여기에 이미지 설명 입력

템플릿에서 값을 얻으려면

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

아직 FontSize 요소를 기반으로 컨트롤의 높이를 바인딩하는 데 능숙하지 않으므로 usercontrol에서 수동으로 내 페이지에서 글꼴 크기를 설정했습니다.

** 참고 :- "아카이브"이름을 내 프로그램의 아카이브로 변경했습니다 =)


위 / 아래 버튼의 사용성은 끔찍합니다. 너무 작아서 편리하지 못합니다. 텍스트 상자와 최소한 같은 높이 (정사각형) 여야합니다. 좀 더 많은 공간이 필요하다는 것을 알고 있지만 최소한 사용 가능한 버튼을 제공합니다. 그렇지 않으면 전혀 삽입 할 이유가 없습니다.
Vincent

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>  


1

샘플을 수행하는 실용적인 방법 :

- 프로젝트를 마우스 오른쪽 버튼으로 클릭 (솔루션 아래)를 "너겟 패키지 관리 ..."를 선택합니다.

-메뉴에서 찾아보기 탭을 클릭 하여 "wpftoolkit"을 검색하고 "Extended.Wpf.Toolkit .

-설치하세요!

-사용자 컨트롤 도구 상자 에서 오른쪽 클릭 "탭 추가 .."를 선택한 다음 이름을 "WPF Toolkit"으로 지정합니다.

-새 "WPF Toolkit"탭을 마우스 오른쪽 버튼으로 클릭하고 "항목 선택 ..."을 선택합니다.

-메뉴에서 "찾아보기 ..."버튼을 클릭하고, nugets 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" ... /> 

개체 (바인딩, 트리거 등)의 완전한 확장 성을 즐기십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.