What I've done in these situations is used the XAML hierarchy to determine which element to show/hide. Something along the lines of:
<Grid>
<TextBlock MouseDown="txtblk_MouseDown" />
<TextBox LostFocus="txtbox_LostFocus" Visibility="Collapsed" />
</Grid>
with the code:
protected void txtblk_MouseDown(object sender, MouseButtonEventArgs e)
{
TextBox txt = (TextBox)((Grid)((TextBlock)sender).Parent).Children[1];
txt.Visibility = Visibility.Visible;
((TextBlock)sender).Visibility = Visibility.Collapsed;
}
protected void txtbox_LostFocus(object sender, RoutedEventArgs e)
{
TextBlock tb = (TextBlock)((Grid)((TextBox)sender).Parent).Children[0];
tb.Text = ((TextBox)sender).Text;
tb.Visibility = Visibility.Visible;
((TextBox)sender).Visibility = Visibility.Collapsed;
}
I always turn stuff like this that I'm going to reuse into a UserControl
, which I can add additional error handling to, and guarantee that the Grid
will only contain two items, and the order of them will never change.
EDIT: Additionally, turning this into a UserControl allows you to create a Text
property for each instantiation, so you can name each one and reference the text directly without fishing for the current value through the ((TextBox)myGrid.Children[1]).Text
casting. This will make your code much more efficient and clean. If you make it into a UserControl, you can also name the TextBlock
and TextBox
elements, so no casting is needed at all.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…