3

我有一个包含两个 StackPanel 的页面,每个 StackPanel 包含一个 TextBox 和一个 Button:

<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代码?还有另一种编码方式吗?我是一个完整的初学者,所以我可能不会想到正确的方法。

4

1 回答 1

3

您可以只绑定到TextBox.IsFocusedXaml 中的属性,并使用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>
于 2012-12-20T21:49:39.400 回答