更新:谢谢Andrew KeepCoding的CustomNumberBox类。这真的很有帮助,而且比其他解决方案更容易使用。它不需要数据绑定就能工作。
关于Chris Schaller提出并由Richard Zhang回答的问题,我有一个澄清/用户错误:How to work around UpdateSourceTrigger ignored in NumberBox
我收到以下两个错误:
错误CS1061“NumberBox”不包含“VisualTreeFindName”的定义,并且找不到接受“NumberBox”类型的第一个参数的可访问扩展方法“VisualTreeFindName”(是否缺少using指令或程序集引用?)
错误CS 0103此处的当前上下文中不存在名称ウModel Ж。
下面是对上一个答案的扩展(虽然我的答案是命名空间记帐..)
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Media;
using System;
namespace Accounting
{
public static class StaticExtension
{
public static FrameworkElement VisualTreeFindName(this DependencyObject element, string name)
{
if (element == null || string.IsNullOrWhiteSpace(name))
{
return null;
}
if (name.Equals((element as FrameworkElement)?.Name, StringComparison.OrdinalIgnoreCase))
{
return element as FrameworkElement;
}
var childCount = VisualTreeHelper.GetChildrenCount(element);
for (int i = 0; i < childCount; i++)
{
var result = VisualTreeHelper.GetChild(element, i).VisualTreeFindName(name);
if (result != null)
{
return result;
}
}
return null;
}
}
}
下面是主窗口.xaml
<Window
x:Class="Accounting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Accounting"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<NumberBox
x:Name="myNumberBox"
SpinButtonPlacementMode="Compact"
Loaded="NumberBox_Loaded"
Value="0" />
</StackPanel>
</Window>
这里是MainWindow.xaml.cs
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using System;
using System.Linq;
using System.Reflection;
namespace Accounting
{
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
}
private void NumberBox_Loaded(object sender, RoutedEventArgs e)
{
var box = sender as NumberBox;
var textBox = box.VisualTreeFindName<TextBox>("InputBox");
textBox.TextChanged += TextBox_TextChanged;
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
string text = (sender as TextBox).Text;
bool isNumber = !text.Any(t => !char.IsDigit(t));
if (isNumber)
{
double.TryParse(text, out double value);
if (value != Model.Value)
Model.Value = value;
}
}
}
}
2条答案
按热度按时间j1dl9f461#
您也可以创建这样的自定义控件。这里的一个缺点是它将始终作为
UpdateSourceTrigger=PropertyChanged
工作。6yt4nkrj2#
错误CS1061“NumberBox”不包含“VisualTreeFindName”的定义,并且找不到接受“NumberBox”类型的第一个参数的可访问扩展方法“VisualTreeFindName”(是否缺少using指令或程序集引用?)
出现此错误是因为方法
VisualTreeFindName
不是泛型方法,并且在调用它时不需要<TextBox>
。删除<TextBox>
并将返回值强制转换为TextBox
应该会起作用,并在NumberBox
内为您提供名为InputBox的TextBox
。错误CS0103此处的当前上下文中不存在名称ウModel Ж。
出现此错误是因为代码中不存在Model。此Model只是问题中用作引用的属性。将Model替换为目标属性应该可以解决此问题。