我在silverlight 4中创建了一个注册表单,其中我有大量的文本框,在每个文本框的前面我放置了一个文本块作为必填字段验证器,当任何文本框留空时在失去焦点的同时,放在它前面的文本块必须变成红色。
文本框名为textbox1,textbox2 ...以及文本块
问题是,我不希望代码为每个特定文本框的具体方法,我想要做的只是在两个三个方法中完成这个
这里我做了一些似乎不正确的编码
private void textBox_LostFocus(object sender, RoutedEventArgs e)
{
var textBox = (TextBox) sender;
if (textbox.Text == "")
{
var textblock = "textblock" + textBox.Name.Remove(0,7);
TextblockColorChange(textblock);
}
}
private void TextblockColorChange(object sender)
{
var textblock = (TextBlock) sender;
textblock.Foreground= new SolidColorBrush(Colors.Red);
}
请建议一些更好的方法。
答案 0 :(得分:2)
我创建一个包含TextBlock和TextBox的UserControl,并在目前拥有TextBlock和TextBox组合的任何地方使用此UserControl。然后,此Usercontrol将在其中包含LostFocus逻辑并相应地更新TextBlock。这样可以防止需要确定要更新的控件的正确名称。
答案 1 :(得分:1)
虽然我实际上更喜欢Bills方法(虽然我倾向于使用模板控制),但这是另一种非常有趣的选择。在你的xaml中使用这种标记: -
<TextBlock Text="Enter Value 1" Foreground="{Binding Tag, ElementName=textBox1, TargetNullValue=Black}" />
<TextBox x:Name="textBox1" LostFocus="txt_LostFocus" />
您的常见txt_LostFocus
可能如下所示: -
private void txt_LostFocus(object sender, RoutedEventArgs e)
{
TextBox txt = ((TextBox)sender);
if (String.IsNullOrEmpty(txt.Text))
{
txt.Tag = new SolidColorBrush(Colors.Red);
}
else
{
txt.Tag = null;
}
}
答案 2 :(得分:1)
你需要这样的东西,
XAML部分:
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Orientation="Horizontal" Height="25">
<TextBox Width="150" LostFocus="TextBox_LostFocus"/>
<TextBlock Text="*" Foreground="#FF0000" VerticalAlignment="Center" Margin="10,0,0,0" Visibility="Collapsed"/>
</StackPanel>
</Grid>
C#Part:
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
var textbox = sender as TextBox;
if(textbox == null) return;
var stackPanel = textbox.Parent as StackPanel;
if(stackPanel == null) return;
var textBlock = stackPanel.Children.Where(a => a is TextBlock).FirstOrDefault();
if (textBlock == null) return;
if (string.IsNullOrEmpty(textbox.Text)) textBlock.Visibility = Visibility.Visible;
else textBlock.Visibility = Visibility.Collapsed;
}
答案 3 :(得分:0)
var textblock = "textblock" + textBox.Name.Remove(0,7);
TextblockColorChange(textblock);
上面的代码只会将字符串发送到TextblockColorChange()
您没有显示任何其他代码,但我猜您要在将结果传递给代码之前对该字符串执行FindControl或FindControl搜索。