WPF数字UpDown控件在哪里?

进入第一个严重的WPF项目。 似乎有很多基本控制单元丢失。 具体来说,我正在寻找数字UpDown控件。 我错过了一个带外发布吗? 真的不想写我自己的控制。

我不想使用WindowsFormHost并在其上放置一个WinForm ctl。 我希望它是完全WPF没有任何遗留垃圾。

谢谢

我做了我自己的;

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

只需在xtended wpf toolkit中使用IntegerUpDown控件就可以像这样使用它:

  1. 添加到您的XAML下面的命名空间:

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

  2. 在您想要控件使用的XAML中:

    <xctk:IntegerUpDown Name="myUpDownControl" />

这是我自己的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; } } 
 <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; } } } 

使用VerticalScrollBar与WPF中的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(); } 

您可以使用由我编写的WPF的NumericUpDown控件作为WPFControls库的一部分。

给定的答案是可以的。 但是,当鼠标离开控制时,我想让button自动隐藏。 这里是我的代码基于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; } } } 

我有一个天真的解决scheme,但有用。 这里是代码:

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