【问题标题】:How do I make a textbox visible and hidden with a checkbox?如何使用复选框使文本框可见和隐藏?
【发布时间】:2018-07-04 01:44:13
【问题描述】:

所以我试图在未选中复选框时使我的文本框不可见。一切正常,直到我选中该框,然后再次取消选中它。文本框将保持可见。

private void chbon_Checked_1(object sender, RoutedEventArgs e)
    {
        if (cchbon.IsChecked == true)
        {

            txtshow.Visibility = System.Windows.Visibility.Visible;
        }
        if (chbon.IsChecked == false)
        {
            txtshow.Visibility = System.Windows.Visibility.Hidden;
        }
    }

这是复选框的 XAML:

<CheckBox x:Name="chbon" Content="On" HorizontalAlignment="Left" Margin="175,84,0,0" VerticalAlignment="Top" Checked="chbon_Checked_1"/>
<TextBox x:Name="txtshow" HorizontalAlignment="Left" Height="23" Margin="272,82,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="29" Visibility="Hidden"/>

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    取消选中时不会触发事件Checked。 事件Unchecked 就是为了这个目的。

    ... Checked="chbon_Checked" Unchecked="chbon_Unchecked"/>
    

    并且无需在后面的代码中监视cchbon.IsChecked

    private void chbon_Checked(object sender, RoutedEventArgs e)
    {
            txtshow.Visibility = System.Windows.Visibility.Visible;
    }
    private void chbon_Unchecked(object sender, RoutedEventArgs e)
    {
            txtshow.Visibility = System.Windows.Visibility.Hidden;
    }
    

    或者,您可以通过绑定和转换器来实现:

    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis"/>
    </Window.Resources>
    
    ...
    
    <CheckBox x:Name="chbon"/>
    <TextBox x:Name="txtshow" Visibility="{Binding ElementName=chbon, Path=IsChecked, 
             Converter={StaticResource BoolToVis}, FallbackValue=Hidden}"/>
    

    请注意, 一旦你管理了这种方法,你可能想要实现一个自定义转换器,因为内置的BooleanToVisibilityConverterTrue/False 输入返回Visible/Collapsed(而不是Visible/Hidden

    【讨论】:

    • BooleanToVisibilityConverter 返回 Visible 或 Collapsed,这不是原始代码的作用:Hidden 与 Collapsed 不同
    【解决方案2】:

    Checked 事件处理程序只会在您选中复选框时触发,而不是取消选中它。您还可以在 XAML 中使用 Unchecked 处理程序来隐藏文本框。

    private void chbon_Unchecked(object sender, RoutedEventArgs e)
    {
         txtshow.Visibility = System.Windows.Visibility.Hidden;
    }
    
    private void chbon_Checked_1(object sender, RoutedEventArgs e)
    {
         txtshow.Visibility = System.Windows.Visibility.Visible;
    }
    

    【讨论】:

      【解决方案3】:

      当 CheckBox 进入未选中状态时,Unchecked 事件触发(类似于Checked)。为它们添加事件处理程序。

      <CheckBox x:Name="chbon" 
          Content="On" 
          HorizontalAlignment="Left" 
          Margin="175,84,0,0" 
          VerticalAlignment="Top" 
          Checked="chbon_Checked_1"
          Unhecked="chbon_Checked_1"/>
      
      private void chbon_Checked_1(object sender, RoutedEventArgs e)
      {
           txtshow.Visibility = cchbon.IsChecked ? Visibility.Visible : Visibility.Hidden;
      }
      

      通常使用绑定到布尔属性来设置某些元素的可见性。 .NET 中有一个BooleanToVisibilityConverter,它为true 返回Visible,为false 返回CollapsedCollapsedHidden 不同:Hidden 元素仍然声称屏幕上的空间,就好像它是可见的一样。

      有一种方法可以使用触发器在 XAML 中实现一切:

      <CheckBox x:Name="chbon" Content="On" 
                HorizontalAlignment="Left" Margin="175,84,0,0" VerticalAlignment="Top"/>
      
      <TextBox x:Name="txtshow" 
               HorizontalAlignment="Left" VerticalAlignment="Top"
               Height="23" Width="29" Margin="272,82,0,0" TextWrapping="Wrap">    
          <TextBox.Style>        
              <Style TargetType="TextBox">            
                  <Setter Property="Visibility" Value="Hidden"/>
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding IsChecked, ElementName=chbon}" Value="True">
                          <Setter Property="Visibility" Value="Visible"/>
                      </DataTrigger>
                  </Style.Triggers>            
              </Style>        
          </TextBox.Style>   
      <TextBox/>
      

      【讨论】:

        猜你喜欢
        • 2021-08-08
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多