Input Controls(输入控件)

输入控件

输入控件是应用中用户界面的一种交互式组件。Android提供了大量的可供在UI中使用的控件,例如按钮、文本框、滑块进度条、复选框、缩放按钮和开关按钮等等。

在UI中添加输入控件就像在 XML layout 中添加XML元素一样简单。例如,下面是一个带有文本框和按钮的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="@string/edit_message" />
    <Button android:id="@+id/button_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage" />
</LinearLayout>

每个输入控件都支持一套特定的输入事件,所以你可以在用户进入文本框或触碰按钮时捕获这些事件。

常用控件


下面是一些常用控件的列表,你可以在你的应用中使用它们。通过这些链接学习更多关于使用控件的知识。

注解:Android提供的控件比这里列出来的要多。浏览 android.widget 包可以发现更多控件。如果你的应用需要特殊的输入控件,你还可以构建自己的 custom components

Control Type Description Related Classes
Button 可以被用户按下或点击来执行某个操作的按钮。 Button
Text field 可编辑的文本框。你可以使用AutoCompleteTextView部件来创建一个可以提供自动完成建议的文本输入部件。 EditText,AutoCompleteTextView
Checkbox 可以由用户切换on/off的开关。当提供给用户一组不互斥的可选项时,你应该使用复选框。 CheckBox
Radio button 与复选框类似,但一组里只能选择一个选项。 RadioGroup 
RadioButton
Toggle button 带有亮度亮度指示器的on/off按钮。 ToggleButton
Spinner 允许用户从一组数据中选择一个的下拉列表。 Spinner
Pickers 供用户通过上/下按钮或滑动手势从一系列值中选择一个的对话框。使用DatePicker部件输入日期(月,天,年)或使用TimePicker部件输入时间(时,分,上午/下午),这些值会自动格式化为用户所在区域的格式。 DatePicker,TimePicker
<think>我们正在寻找或实现一个用于输入数值的WPF控件。在WPF中,并没有内置的专门用于数值输入控件,但我们可以通过使用TextBox并添加验证来实现,或者使用一些第三方控件库。这里我们将重点放在自定义实现上。 步骤: 1. 我们可以使用TextBox作为基础控件,然后通过附加属性和事件处理来限制输入只能为数值。 2. 另一种方法是继承TextBox并添加数值输入的特性。 3. 我们还可以使用NumericUpDown控件,但WPF本身不提供,不过WPF Toolkit中有一个,或者我们可以自己实现。 考虑到用户要求一个例子或实现,我们将展示一个简单的自定义实现。 设计思路: - 允许输入整数或浮点数(根据需求) - 可以设置最小值、最大值 - 可以设置小数位数(对于浮点数) - 提供增加/减少按钮(可选) 这里我们实现一个简单的数值输入框,支持整数输入,并带有增加/减少按钮(类似于NumericUpDown)。 实现步骤: 1. 创建一个用户控件,包含一个TextBox和两个Button(用于增加和减少)。 2. 在TextBox中,我们将处理文本输入事件,只允许输入数字和负号(如果需要负数),并且可以处理退格、删除等控制键。 3. 我们也可以使用数据绑定将数值绑定到一个属性上。 由于我们要求是数值输入,所以还需要处理粘贴等情况。 下面是一个简单的实现: 首先,创建一个名为NumericUpDown的用户控件。 在XAML中: ```xml <UserControl x:Class="YourNamespace.NumericUpDown" 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" mc:Ignorable="d" d:DesignHeight="30" d:DesignWidth="100"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <TextBox x:Name="textBox" Grid.Column="0" Grid.RowSpan="2" Text="{Binding Value, RelativeSource={RelativeSource AncestorType=UserControl}, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="TextBox_PreviewTextInput" DataObject.Pasting="TextBox_Pasting"/> <Button x:Name="upButton" Grid.Column="1" Grid.Row="0" Width="20" Click="UpButton_Click">↑</Button> <Button x:Name="downButton" Grid.Column="1" Grid.Row="1" Width="20" Click="DownButton_Click">↓</Button> </Grid> </UserControl> ``` 在代码隐藏中: ```csharp using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace YourNamespace { public partial class NumericUpDown : UserControl { public NumericUpDown() { InitializeComponent(); } public int Value { get { return (int)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(NumericUpDown), new PropertyMetadata(0, OnValueChanged)); private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // 当值改变时,可以更新文本框 NumericUpDown control = d as NumericUpDown; control.textBox.Text = control.Value.ToString(); } private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { // 允许数字和负号(但负号只能出现在开头) TextBox textBox = sender as TextBox; string newText = textBox.Text.Insert(textBox.CaretIndex, e.Text); // 检查是否为数字(允许负数) if (!int.TryParse(newText, out int result)) { e.Handled = true; } } private void TextBox_Pasting(object sender, DataObjectPastingEventArgs e) { if (e.DataObject.GetDataPresent(typeof(string))) { string text = (string)e.DataObject.GetData(typeof(string)); if (!int.TryParse(text, out int result)) { e.CancelCommand(); } } else { e.CancelCommand(); } } private void UpButton_Click(object sender, RoutedEventArgs e) { Value++; } private void DownButton_Click(object sender, RoutedEventArgs e) { Value--; } } } ``` 注意:这个实现比较简单,只处理整数,并且没有考虑最小值、最大值以及负号只能出现在开头等细节。在实际使用中,你可能需要完善它。 另外,我们还可以使用附加行为来实现,这样不需要创建新的控件,只需将行为附加到TextBox上。 附加行为实现示例(仅处理输入验证): ```csharp public static class NumericInputBehavior { public static readonly DependencyProperty IsNumericOnlyProperty = DependencyProperty.RegisterAttached("IsNumericOnly", typeof(bool), typeof(NumericInputBehavior), new UIPropertyMetadata(false, OnIsNumericOnlyChanged)); public static bool GetIsNumericOnly(DependencyObject d) { return (bool)d.GetValue(IsNumericOnlyProperty); } public static void SetIsNumericOnly(DependencyObject d, bool value) { d.SetValue(IsNumericOnlyProperty, value); } private static void OnIsNumericOnlyChanged(object sender, DependencyPropertyChangedEventArgs e) { if (sender is TextBox textBox) { bool newValue = (bool)e.NewValue; if (newValue) { textBox.PreviewTextInput += TextBox_PreviewTextInput; textBox.PreviewKeyDown += TextBox_PreviewKeyDown; DataObject.AddPastingHandler(textBox, TextBox_Pasting); } else { textBox.PreviewTextInput -= TextBox_PreviewTextInput; textBox.PreviewKeyDown -= TextBox_PreviewKeyDown; DataObject.RemovePastingHandler(textBox, TextBox_Pasting); } } } private static void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { TextBox textBox = sender as TextBox; string newText = textBox.Text.Insert(textBox.CaretIndex, e.Text); if (!double.TryParse(newText, out double result)) { e.Handled = true; } } private static void TextBox_Pasting(object sender, DataObjectPastingEventArgs e) { if (e.DataObject.GetDataPresent(typeof(string))) { string text = (string)e.DataObject.GetData(typeof(string)); if (!double.TryParse(text, out double result)) { e.CancelCommand(); } } else { e.CancelCommand(); } } private static void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { // 允许退格、删除、Tab等键 if (e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Tab) { return; } // 这里可以进一步控制,但上面的PreviewTextInput已经处理了大部分情况 } } ``` 在XAML中使用附加行为: ```xml <TextBox local:NumericInputBehavior.IsNumericOnly="True"/> ``` 以上两种方法都可以实现数值输入。用户可以根据需要选择。 另外,如果不想自己实现,可以考虑使用第三方库,如MahApps.Metro,它提供了NumericUpDown控件。 使用MahApps.Metro的示例: 1. 安装MahApps.Metro NuGet包。 2. 在XAML中添加命名空间:`xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"` 3. 使用控件:`<mah:NumericUpDown Value="{Binding MyValue}" Minimum="0" Maximum="100" Interval="1" StringFormat="F0"/>` 总结:在WPF中实现数值输入控件有多种方式,可以根据项目的复杂度和需求选择合适的方法。 引用说明: 在WPF中,我们可以通过自定义用户控件、附加行为或使用第三方库来实现数值输入控件。上述示例展示了两种自定义实现方法,并提到了第三方库MahApps.Metro[^1][^3]。 §§相关问题§§ 1. 如何在WPF中实现一个只能输入数字的TextBox? 2. 如何为WPF控件添加输入验证? 3. 有哪些好用的WPF第三方控件库?</think>### WPF数值输入控件实现方案 在WPF中实现数值输入控件主要有三种方法:使用内置控件扩展、自定义用户控件或采用第三方库。以下是具体实现方案: #### 方法1:使用内置TextBox扩展(推荐简单场景) ```xml <TextBox PreviewTextInput="NumericTextBox_PreviewTextInput" PreviewKeyDown="NumericTextBox_PreviewKeyDown"/> ``` ```csharp private void NumericTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { // 只允许数字、小数点和负号 TextBox textBox = sender as TextBox; string newText = textBox.Text.Insert(textBox.CaretIndex, e.Text); e.Handled = !double.TryParse(newText, out _); } private void NumericTextBox_PreviewKeyDown(object sender, KeyEventArgs e) { // 允许控制键(退格、删除等) if (e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Tab) return; // 允许数字键 if ((e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)) return; // 允许小数点和负号 if (e.Key == Key.OemPeriod || e.Key == Key.Decimal || e.Key == Key.Subtract) return; e.Handled = true; } ``` #### 方法2:自定义NumericUpDown控件(完整功能) ```xml <UserControl x:Class="YourApp.NumericUpDown"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBox x:Name="ValueBox" Text="{Binding Value}"/> <StackPanel Grid.Column="1" Orientation="Vertical"> <Button x:Name="UpButton" Click="UpButton_Click">▲</Button> <Button x:Name="DownButton" Click="DownButton_Click">▼</Button> </StackPanel> </Grid> </UserControl> ``` ```csharp public partial class NumericUpDown : UserControl { public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(NumericUpDown), new PropertyMetadata(0.0, OnValueChanged)); public double Value { get => (double)GetValue(ValueProperty); set => SetValue(ValueProperty, value); } private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // 添加范围验证等逻辑 } private void UpButton_Click(object sender, RoutedEventArgs e) => Value += 1; private void DownButton_Click(object sender, RoutedEventArgs e) => Value -= 1; } ``` #### 方法3:使用第三方库(推荐企业级应用) 1. **MahApps.Metro**(流行开源库): ```xml <mah:NumericUpDown Value="{Binding Amount}" Minimum="0" Maximum="100" Interval="0.5" StringFormat="F2"/> ``` 2. **Extended WPF Toolkit**: ```xml <xctk:DoubleUpDown Value="{Binding Price}" FormatString="C2" Increment="0.25"/> ``` #### 关键功能增强建议 1. **数据验证**: ```csharp public class NumericRangeRule : ValidationRule { public double Min { get; set; } = double.MinValue; public double Max { get; set; } = double.MaxValue; public override ValidationResult Validate(object value, CultureInfo cultureInfo) { if (!double.TryParse(value.ToString(), out double num)) return new ValidationResult(false, "必须为数字"); return (num >= Min && num <= Max) ? ValidationResult.ValidResult : new ValidationResult(false, $"范围: {Min}-{Max}"); } } ``` 2. **绑定使用**: ```xml <local:NumericUpDown Value="{Binding Temperature, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/> ``` 3. **国际化支持**: ```csharp CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator = ","; ``` ### 设计注意事项 1. 支持触摸屏操作(增大点击区域) 2. 添加键盘导航支持(↑/↓键调整数值) 3. 实现数据绑定兼容(`INotifyPropertyChanged`) 4. 提供格式化选项(货币、百分比等) 5. 包含输入限制(最小值/最大值) WPF的标记与代码分离架构使您可以轻松实现此类自定义控件,通过XAML定义界面,C#处理业务逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值