我正在 WPF 中寻找一个简单的 NumericUpDown(又名数字微调器)控件。这似乎是 WPF 中另一个缺乏控制的问题。肯定有一些现有的,我不喜欢重新发明轮子。
4 回答
扩展的 WPF 工具包有一个:NumericUpDown
如果商业解决方案没问题,你可以考虑这个控件集: Mindscape 的 WPF Elements
它包含这样一个旋转控件,或者(我个人的偏好)一个旋转装饰器,可以像这样在 XAML 中装饰各种数字控件(如 IntegerTextBox、NumericTextBox,也是控件集的一部分):
<WpfElements:SpinDecorator>
<WpfElements:IntegerTextBox Text="{Binding Foo}" />
</WpfElements:SpinDecorator>
添加文本框和滚动条
在 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
原始 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 和 Horizontal 触发动作。然后我们将剩余部分分组到一个网格中,并为数字添加一个 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>
资料来源: