【发布时间】:2011-09-13 07:04:18
【问题描述】:
好的,所以我很确定我在这个小应用程序上走在正确的轨道上,但请告诉我。用户在 4 个可编辑的文本框中输入 4 个数字中的 3 个,然后自动计算缺失的数字。应用图片在这里:
http://www.peauproductions.com/images/lens_app.PNG
我研究过数据绑定,我认为我需要让值能够全局更改。我希望这些值能够动态更新/计算,而不必有计算按钮。
一旦我让它工作,我需要实施验证检查以确保只输入布尔值(无文本),并弹出一个工具提示说输入数字。
立即收到以下错误:
"'设置属性 'System.Windows.Controls.TextBox.Text' 抛出异常。'行号 '56' 和行位置 '51'。”
MainWindow.xaml 代码:
<Window x:Class="ConverterApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ConverterApp" Height="360" Width="280"
xmlns:c="clr-namespace:ConvertorApp;assembly=">
<Grid>
<!--Outer Box + Title-->
<TextBox Height="309" Width="248"
Text=" Lens Calculator"
IsReadOnly="True"
Margin="5,5,0,0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
BorderThickness="2.0"
FontSize="16" FontFamily="Verdana" FontWeight="Bold">
<TextBox.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >
<GradientStop Color="Black" Offset="0" />
</LinearGradientBrush>
</TextBox.BorderBrush>
</TextBox>
<!--Title Text-->
<TextBox Height="50" Width="230"
Text="Enter Image Width, Length and Either Distance or Lens Values Below"
IsReadOnly="True"
Margin="14,29,0,0"
TextWrapping="Wrap"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontSize="12" FontFamily="Verdana" FontStyle="Italic"
BorderThickness="0">
</TextBox>
<TextBox Height="20" Width="230"
Text="Must Be Same Units (in,ft,cm,mm)"
IsReadOnly="True"
Margin="14,59,0,0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontSize="10" FontFamily="Verdana" FontStyle="Italic"
BorderThickness="0">
</TextBox>
<!--Distance-->
<TextBox Height="20" Width="105"
Text="Distance/Height:"
IsReadOnly="True"
Margin="15,80,0,0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana"
BorderThickness="0">
</TextBox>
<TextBox x:Name="DistanceBox" Height="20" Width="50"
Text="{x:Static c:Variables.DistanceBox}"
Margin="125,80,0,0"
MaxLength="5"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana">
<TextBox.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >
<GradientStop Color="Black" Offset="0" />
</LinearGradientBrush>
</TextBox.BorderBrush>
</TextBox>
<!--Image Width-->
<TextBox Height="20" Width="90"
Text="Image Width:"
IsReadOnly="True"
Margin="15,105,0,0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana"
BorderThickness="0">
</TextBox>
<TextBox x:Name="WidthBox" Height="20" Width="50"
Text="{x:Static c:Variables.WidthBox}"
Margin="125,105,0,0"
MaxLength="5"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana">
<TextBox.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >
<GradientStop Color="Black" Offset="0" />
</LinearGradientBrush>
</TextBox.BorderBrush>
</TextBox>
<!--Image Length-->
<TextBox Width="95"
Text="Image Length:"
IsReadOnly="True"
Margin="15,130,0,161" HorizontalAlignment="Left"
FontFamily="Verdana"
BorderThickness="0">
</TextBox>
<TextBox x:Name="LengthBox" Height="20" Width="50"
Text="{x:Static c:Variables.LengthBox}"
Margin="125,130,0,0"
MaxLength="5"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana">
<TextBox.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >
<GradientStop Color="Black" Offset="0" />
</LinearGradientBrush>
</TextBox.BorderBrush>
</TextBox>
<!--Lens Needed-->
<TextBox Height="20" Width="90"
Text="Lens (mm):"
IsReadOnly="True"
Margin="15,155,0,0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana"
BorderThickness="0">
</TextBox>
<TextBox x:Name="LensNeeded" Height="20" Width="50"
Text="{x:Static c:Variables.LensNeeded}"
Margin="125,155,0,0"
MaxLength="4"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana">
<TextBox.BorderBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >
<GradientStop Color="Black" Offset="0" />
</LinearGradientBrush>
</TextBox.BorderBrush>
</TextBox>
<!--Info-->
<TextBox Height="70" Width="230"
Text="The lens focal length value represents the estimated mm value for a 1/4 inch sensor (Playstation Eye). A lower mm will give a wider Field of View (FOV), and a higher value less FOV. "
IsReadOnly="True"
TextWrapping="Wrap"
Margin="15,180,0,0"
FontSize="11"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana" FontStyle="Italic"
BorderThickness="0">
</TextBox>
<TextBox Height="55" Width="230"
Text="It is not recommend you use a lens of less than 2.5mm focal length with image tracking software due to distortion."
IsReadOnly="True"
FontSize="11"
TextWrapping="Wrap"
Margin="15,253,0,0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
FontFamily="Verdana" FontStyle="Italic"
BorderThickness="0">
</TextBox>
</Grid>
MainWindow.xaml.cs 代码:
using System;
using System.Windows;
namespace ConvertorApp
{
public class Variables
{
public const double DistanceBox = 0;
public const double WidthBox = 0;
public const double LengthBox = 0;
public const double LensNeeded = 0;
public const double WidthBased = 0;
public const double LengthBased = 0;
public void Calc()
{
double WidthBased = 2.952*(DistanceBox/WidthBox);
double LengthBased = 3.984*(DistanceBox/LengthBox);
if (WidthBased < LengthBased)
{
double LensNeeded = WidthBased;
}else{
double LensNeeded = LengthBased;
}
}
}
}
如果您能想到一种更简单或更正确的方法来完成我正在尝试做的事情,请告诉我(我刚开始学习 WPF/C# 的东西)。谢谢
更新:
这是后面的代码,显示了下面的建议更改:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace ConverterApp
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Variables();
}
}
public class Variables : INotifyPropertyChanged
{
// Declare the PropertyChanged event.
public event PropertyChangedEventHandler PropertyChanged;
private double m_distanceBox;
public double DistanceBox
{
get { return m_distanceBox; }
set
{
m_distanceBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("DistanceBox");
}
}
private double m_widthBox;
public double WidthBox
{
get { return m_widthBox; }
set
{
m_widthBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("WidthBox");
}
}
private double m_lengthBox;
public double LengthBox
{
get { return m_lengthBox; }
set
{
m_lengthBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("LengthBox");
}
}
private double m_lensBox;
public double LensNeeded
{
get { return m_lensBox; }
set
{
m_lensBox = value;
// modify calc to read the text values
Calc();
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("LensNeeded");
}
}
public void Calc()
{
double WidthBased = 2.95 * (DistanceBox / WidthBox);
double LengthBased = 3.98 * (DistanceBox / LengthBox);
if (WidthBased < LengthBased)
{
LensNeeded = Math.Round(WidthBased,2);
}else{
LensNeeded = Math.Round(LengthBased,2);
}
}
// NotifyPropertyChanged will raise the PropertyChanged event,
// passing the source property that is being updated.
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
}
**ERROR 我现在得到的是双重函数内 get {} 上的 StackOverflowException。有什么想法吗?
【问题讨论】:
-
异常的
InnerException是什么? -
您的 .cs 代码可能没有按照您的想法执行。
double LensNeeded = WidthBased;行创建了一个名为LensNeeded的新变量,该变量在该行之后被丢弃,因为您不使用它。 -
@svick 请查看更新的代码隐藏。仍然不知道在哪里添加 DataContext。当我把它放在代码隐藏中时,错误不断出现。谢谢
-
你一定是删除了MainWindow的C#代码。请参阅我的更新答案。
-
这很可能是因为
MainWindow的 C# 代码和 XAML 代码的命名空间必须匹配。您在 XAML 中有ConverterApp,但在 C# 中有ConvertorApp。
标签: c# wpf dynamic binding textbox