- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园.
通过WPF的按钮、文本输入框实现了一个简单的SpinBox数字输入用户组件并可以通过数据绑定数值和步长。本文中介绍了通过Xaml代码实现自定义组件的布局,依赖属性的定义和使用等知识点.
完整代码见Github 。
SpinBox由一个文本输入框和两个箭头按钮组成,我们在Xaml 代码中先把基本的布局做好。其实可以发现自定义用户控件布局和普通的窗体布局的Xaml代码差不多,只不过Xaml的根标签从Window变成了UserControl .
<UserControl x:Class="SpinBox.MySpinBox"
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:SpinBox"
mc:Ignorable="d"
d:DesignHeight="36" d:DesignWidth="92">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtBoxValue" Grid.Column="0"
TextAlignment="Center" VerticalContentAlignment="Center"/>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="5*"/>
<RowDefinition Height="5*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" x:Name="btnPlus">▲</Button>
<Button Grid.Row="1" x:Name="btnMinor">▼</Button>
</Grid>
</Grid>
</UserControl>
因为我们是WPF中制作的用户组件,因此希望输入的数值、步长的配置等可以在Xaml中实现。因此我们需要给我们新建的用户组件增加依赖属性。这里我们直接通过依赖属性值变化的回调函数来实现文本框信息的更新.
/// <summary>
/// SpinBox.xaml 的交互逻辑
/// </summary>
[ContentProperty("Value")]
public partial class MySpinBox : UserControl
{
/// <summary>
/// DepedencyProperty for Step
/// </summary>
public static readonly DependencyProperty StepProperty
= DependencyProperty.Register("Step", typeof(double),
typeof(MySpinBox), new PropertyMetadata(1.0));
/// <summary>
/// DepedencyProperty for Value
/// </summary>
public static readonly DependencyProperty ValueProperty
= DependencyProperty.Register("Value", typeof(double),
typeof(MySpinBox), new FrameworkPropertyMetadata(0.0,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
| FrameworkPropertyMetadataOptions.Journal
| FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnValueChanged))
);
public double Value
{
get => (double)GetValue(ValueProperty);
set
{
if (Value != value)
{
SetValue(ValueProperty, value);
}
}
}
public double Step
{
get => (double)GetValue(StepProperty);
set
{
if (Step != value)
{
SetValue(StepProperty, value);
}
}
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var spinBox = d as MySpinBox;
if (spinBox != null)
{
spinBox.txtBoxValue.Text = e.NewValue.ToString();
}
}
}
接下来我们在MainWindow.xaml中增加刚刚编写好的MySpinBox组件 。
<Window x:Class="SpinBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SpinBox"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<local:MySpinBox MaxHeight="64" MaxWidth="128" Step="2" Value="5"/>
</Grid>
</Window>
我们在自定义组件中增加按钮组件的响应 。
<Button Grid.Row="0" x:Name="btnPlus" Click="btnPlus_Click">▲</Button>
<Button Grid.Row="1" x:Name="btnMinor" Click="btnMinor_Click">▼</Button>
在C#代码中增加对应的响应逻辑就能实现完整的效果 。
private void btnPlus_Click(object sender, RoutedEventArgs e)
{
Value += Step;
}
private void btnMinor_Click(object sender, RoutedEventArgs e)
{
Value -= Step;
}
最后需要说明下的是按钮的Unicode值得十六进制表示分别是0x25B2 和0x25BC 。Xaml本质是一种XML文本,因此在其中表示Unicode要使用XML对应的语法格式.
最后此篇关于SimpleWPF:WPF自定义一个可以定义步长的SpinBox的文章就讲到这里了,如果你想了解更多关于SimpleWPF:WPF自定义一个可以定义步长的SpinBox的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 jquery 移动应用程序中,我必须使用三个依赖的旋转框,如下图所示 目前正在使用这个插件 http://dev.jtsage.com/jQM-Spinbox/ 成人/ child /婴儿的最大值
除了已记录的类之外,ttk.Spinbox 类和 tk.Spinbox 类之间有什么区别? 我发现了一些差异,例如: ttk.Spinbox 在按下箭头后设置为 0,而 tk.Spinbox 则不会。
我有一个 tkinter spinbox 小部件。 val = IntVar() Spinbox(from_=1, to=10, textvariable=val, command=l
我有一个 tkinter spinbox: sb = Spinbox(frame, from_=1, to=12) 我想将 spinbox 的默认值设置为 4。我该怎么做? 我已阅读布莱恩建议设置的帖
当我打开一个文件对话框然后将其他内容写入根目录时,我可以使用向上和向下箭头更改旋转框的值,但我不能单击并写入它。我在这里做错了什么?这是已知错误吗? 当我不调用 filedialog.askopenf
我希望我的 Qt Spin-box 在用户到达值范围的两端时旋转值。 例如让我的范围是 0 到 10,增量为 2。当值已经是 10 时单击旋转框的增量按钮后,通常没有任何反应。但我希望它将值旋转回第一
如何执行将在 Tkinter spinbox 小部件上设置默认值的命令?出于某种原因,他们没有给它 .set() 属性 最佳答案 也许您正在寻找“插入”命令? 以下示例将值设置为 2: Tkinter
在 macOS Mojave 上运行从 python.org 下载的 Python3.7。 我使用以下代码排列一个 Spinbox 和一个 Scale 来控制同一个变量。但是,外观不是我所期望的: i
我正在尝试利用 Bryan Oakley 的这个出色答案,但无济于事 ( https://stackoverflow.com/a/4140988/5060127 )... 我想用同样的方法来验证 Sp
我正在使用 Python 2.6.5 和 TKinter.TkVersion 8.5 这是错误行为的 MWE: import Tkinter as tk root = tk.Tk() classic_
我正在使用 rtcltk 在 R 中创建一个旋转框和: from ", updatePlot),其中 spinbox 是指向 spinbox 的变量)。 关于r - 捕捉 Spinbox 中的变化 -
我有几个旋转框,我希望它们在值更改时更改背景颜色。 使用此连接命令: self.doubleSpinBox_1.valueChanged.connect(self.color) 我的第一次尝试是: d
我有几个旋转框,我希望它们在值更改时更改背景颜色。 使用此连接命令: self.doubleSpinBox_1.valueChanged.connect(self.color) 我的第一次尝试是: d
您能否告诉我如何将 Tkinter Spinbox 与函数 updateVal 绑定(bind)以跟踪 Spinbox 上的更改并更新全局变量 val? from Tkinter import * m
我正在使用 Python 3.x 创建一个多语言“日历”小部件,该小部件具有用于年、月、日等的独立旋转框。要求是无论使用什么小部件,都绝不能隐藏 GUI 的任何部分时间,从而排除下拉列表等,使旋转框成
我目前无法从旋转框小部件获取正确的值。我不知道出了什么问题。我已经寻找解决方案但一无所获。我究竟做错了什么?这是我的代码: from Tkinter import * #create Tk windo
当我在 QSpinBox 上按 Enter(实际上在每个输入框上)时,我需要提高 QPushButton 的点击信号,但即使我的按钮是默认按钮,以下代码不起作用。 #include #include
是否可以修改 PyQt spinbox 以处理大于 32 位的整数(-2147483648 - 2147483647)?我知道可以用 C++ 编写一个具有 64 位 int 数据类型的新旋转框,但这会
是否可以修改 PyQt spinbox 以处理大于 32 位的整数(-2147483648 - 2147483647)?我知道可以用 C++ 编写一个具有 64 位 int 数据类型的新旋转框,但这会
我第一次使用pyqt4开发GUI; 我有一个旋转框,我希望其中允许的值范围取决于另一个旋转框的值。例如,第一个旋转框中允许的最大值应等于第二个旋转框中的值。 我认为使用 valueChanged()
我是一名优秀的程序员,十分优秀!