103

我正在 WPF 中寻找一个简单的 NumericUpDown(又名数字微调器)控件。这似乎是 WPF 中另一个缺乏控制的问题。肯定有一些现有的,我不喜欢重新发明轮子。

4

4 回答 4

100

扩展的 WPF 工具包有一个:NumericUpDown 在此处输入图像描述

于 2011-03-17T03:23:48.583 回答
1

如果商业解决方案没问题,你可以考虑这个控件集: Mindscape 的 WPF Elements

它包含这样一个旋转控件,或者(我个人的偏好)一个旋转装饰器,可以像这样在 XAML 中装饰各种数字控件(如 IntegerTextBox、NumericTextBox,也是控件集的一部分):

<WpfElements:SpinDecorator>
   <WpfElements:IntegerTextBox Text="{Binding Foo}" />
</WpfElements:SpinDecorator>
于 2009-09-14T12:06:47.130 回答
1

添加文本框和滚动条

在 VB 中

Private Sub Textbox1_ValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) Handles Textbox1.ValueChanged
     If e.OldValue > e.NewValue Then
         Textbox1.Text = (Textbox1.Text + 1)
     Else
         Textbox1.Text = (Textbox1.Text - 1)
     End If
End Sub
于 2010-11-28T21:13:36.117 回答
1

原始 WPF 控件集中缺少但经常使用的控件是 NumericUpDown 控件。这是一种让用户在小范围内从固定范围内选择数字的巧妙方法。可以使用滑块,但对于水平空间很小的紧凑型表单,NumericUpDown 是必不可少的。

解决方案 A(通过 WindowsFormsHost)

您可以通过将 Windows 窗体 NumericUpDown 控件托管在 WindowsFormsHost 中来使用 WPF 中的控件。请注意,您必须包含对System.Windows.Forms.dll程序集的引用。

<Window x:Class="WpfApplication61.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>    
        <WindowsFormsHost>
            <wf:NumericUpDown/>
        </WindowsFormsHost>
...

解决方案 B(自定义)

周围有几个商业和 codeplex 版本,但都涉及安装 3rd 方 dll 和项​​目开销。构建你自己的要简单得多,而且使用 ScrollBar 是一种有目的的方法。

没有 Thumb(只是中继器按钮)的垂直 ScrollBar 实际上正是我们想要的。它继承了 rom RangeBase,因此它具有我们需要的所有属性,例如 Min、Max 和 SmallChange(设置为 1,将其限制为整数值)

所以我们改变了ScrollBar ControlTemplate。首先,我们删除 Thumb 和 Horizo​​ntal 触发动作。然后我们将剩余部分分组到一个网格中,并为数字添加一个 TextBlock:

<Grid Margin="2">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock VerticalAlignment="Center" FontSize="20" MinWidth="25" Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}"/>
    <Grid Grid.Column="1" x:Name="GridRoot" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Background="{TemplateBinding Background}">
        <Grid.RowDefinitions>
            <RowDefinition MaxHeight="18"/>
            <RowDefinition Height="0.00001*"/>
            <RowDefinition MaxHeight="18"/>
        </Grid.RowDefinitions>
        <RepeatButton x:Name="DecreaseRepeat" Command="ScrollBar.LineDownCommand" Focusable="False">
            <Grid>
                <Path x:Name="DecreaseArrow" Stroke="{TemplateBinding Foreground}" StrokeThickness="1" Data="M 0 4 L 8 4 L 4 0 Z"/>
            </Grid>
        </RepeatButton>
        <RepeatButton Grid.Row="2" x:Name="IncreaseRepeat" Command="ScrollBar.LineUpCommand" Focusable="False">
            <Grid>
                <Path x:Name="IncreaseArrow" Stroke="{TemplateBinding Foreground}" StrokeThickness="1" Data="M 0 0 L 4 4 L 8 0 Z"/>
            </Grid>
        </RepeatButton>
    </Grid>
</Grid>

资料来源:

于 2014-02-20T12:22:20.117 回答