2012-12-20 22 views
3

我有含有两个StackPanels,每个包含一个文本框和一个按钮的页面:隐藏/显示XAML元件或块LostFocus事件

<StackPanel x:Name="Row1"> 
<TextBox x:Name="TextBox1" Text="" GotFocus="OnFocusHandler" LostFocus="OffFocusHandler"/> 
<Button x:Name="Button1" Content="Convert" Click="OnClickHandler" Visibility="Collapsed"/> 
</StackPanel> 

<StackPanel x:Name="Row2"> 
<TextBox x:Name="TextBox2" Text="" GotFocus="OnFocusHandler" LostFocus="OffFocusHandler"/> 
<Button x:Name="Button2" Content="Convert" Click="OnClickHandler" Visibility="Collapsed"/> 
</StackPanel> 

我想执行以下操作:

  • 当一个文本框具有焦点,另一个文本框必须隐藏并且相应的按钮必须显示
  • 当文本框不在焦点时,我们回到原始显示:只有空的文本框可见
  • 我不想让按钮能够触发OffFocusHandler

这是当前的代码,我有三个处理程序:

private void OnFocusHandler(object sender, RoutedEventArgs e) 
{ 
    TextBox SenderTextBox = (TextBox)sender; 

    if (SenderPanel.Name == "TextBox1") 
    { 
     Button1.Visibility = Visibility.Visible; 
    } 
    else if (SenderPanel.Name == "TextBox2") 
    { 
     Button2.Visibility = Visibility.Visible; 
    } 
} 

private void OffFocusHandler(object sender, RoutedEventArgs e) 
{ 
    TextBox1.Text = ""; 
    TextBox2.Text = ""; 
    Button1.Visibility = Visibility.Collapsed; 
    Button2.Visibility = Visibility.Collapsed; 
} 

private void OnClickHandler(object sender, RoutedEventArgs e) 
{ 
    // some stuff unrelated to my issue 
} 

如何避免点击按钮来触发代码是OffFocusHandler? 有没有另外一种方法来编码?我是一个完整的初学者,所以我可能不会认为正确的方法。

回答

3

您可以将其绑定到Xaml中的TextBox.IsFocused属性,并使用BooleanToVisibilityConverter来显示/隐藏该按钮。

实施例:

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication4" 
     Title="MainWindow" Height="300" Width="400" Name="UI" > 
    <Window.Resources> 
     <BooleanToVisibilityConverter x:Key="BoolTovisible" /> 
    </Window.Resources> 

    <Grid> 
     <StackPanel x:Name="Row1" Height="54" VerticalAlignment="Top"> 
      <TextBox x:Name="TextBox1" Text="" /> 
      <Button x:Name="Button1" Content="Convert" Visibility="{Binding ElementName=TextBox1, Path=IsFocused, Converter={StaticResource BoolTovisible}}"/> 
     </StackPanel> 

     <StackPanel x:Name="Row2" Margin="0,60,0,0" Height="51" VerticalAlignment="Top"> 
      <TextBox x:Name="TextBox2" Text="" /> 
      <Button x:Name="Button2" Content="Convert" Visibility="{Binding ElementName=TextBox2, Path=IsFocused, Converter={StaticResource BoolTovisible}}"/> 
     </StackPanel> 
    </Grid> 
</Window> 
+0

由于sa_ddam213。 但是,BooleanToVisibilityConverter似乎不受Windows应用程序支持。我试图找到它的等价物。如果我找到了,我会在这里通知你们。 –

+0

好的,即使在使用此(http://kentb.blogspot.com/2011/02/booleantovisibilityconverter.html)创建自己的BooleanToVisibilityConverter后,我无法使其工作。 我添加BooleanToVisibilityConverter这样: ' <共同:BooleanToVisibilityConverter X:键= “BoolTovisible”/> ' –