【问题标题】:WPF show StackPanel when Checkbox is ticked勾选复选框时 WPF 显示 StackPanel
【发布时间】:2015-04-21 17:50:17
【问题描述】:

我正在尝试将StackPanel 添加到我的应用程序中,该应用程序仅在用户选中CheckBox 时才可见。我为此写的xaml在这里:

<Window>
  <Grid>
    <StackPanel>   
       <StackPanel Orientation="Horizontal">
            <CheckBox Content="Override Offsets?" Name="offsetCB" Margin="5" Checked="OffsetOverride_Checked" Unchecked="OffsetOverride_Unchecked"/>
        </StackPanel>

        <StackPanel Orientation="Horizontal" Visibility="Collapsed">

            <StackPanel.Style>
                <Style TargetType="{x:Type StackPanel}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=offsetCB, Path=IsChecked}" Value="True">
                            <Setter Property="Visibility" Value="Visible" />

                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>

                    <TextBlock Margin="5" Text="Can you see me?"/>
        </StackPanel> 
    </StackPanel>
  </Grid>
<Window>

当检查CheckBox 时,没有任何变化,但我没有看到任何异常或类似的东西。我们的想法是,一旦它起作用,我将添加更多元素,而不是单个 TextBlock

我觉得我可能犯了一个简单的错误,任何建议都将不胜感激。

【问题讨论】:

  • 为什么不直接绑定到stackpanel的Visibility属性呢?而不是使用 DataTriggers.. 一旦你决定这样做,你可能不得不使用转换器
  • 它们包含在StackPanel 中,而Grid 又位于Grid 中。为了清楚起见,我将编辑问题。正如您可能知道的那样,我远不是 WPF 专家。

标签: c# wpf xaml


【解决方案1】:

您可以使用PresentationFramework 中提供的BooleanToVisibilityConverter。声明以下资源:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>

那么就可以在XAML代码中使用Converter如下:

<StackPanel Orientation="Horizontal">
    <CheckBox Content="Override Offsets?"
              Name="offsetCB" 
              Margin="5"
              Checked="OffsetOverride_Checked" 
              Unchecked="OffsetOverride_Unchecked"/>
</StackPanel>

<StackPanel Orientation="Horizontal" 
            Visibility="{Binding Path=IsChecked, 
                         ElementName=offsetCB, 
                         Converter={StaticResource BooleanToVisibilityConverter}">

【讨论】:

    【解决方案2】:

    您将(至少)需要为布尔值 true 添加一个 ResourceValue="True" 是字符串文字 "True",而不是布尔值。

    <StackPanel.Resources>
        <s:Boolean x:Key="True">True</s:Boolean>
    </StackPanel.Resources>
    

    并使用它:

    <DataTrigger Binding="{Binding ElementName=offsetCB, Path=IsChecked}"
                 Value="{StaticResource True}">
    

    【讨论】:

      【解决方案3】:

      试试这个

      <Style.Triggers>
                                  <DataTrigger Binding="{Binding ElementName=offsetCB, Path=IsChecked}" Value="True">
                                      <Setter Property="Visibility" Value="Visible" />
                                  </DataTrigger>
                                  <DataTrigger Binding="{Binding ElementName=offsetCB, Path=IsChecked}" Value="False">
                                      <Setter Property="Visibility" Value="Collapsed" />
                                  </DataTrigger>
                              </Style.Triggers>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 2010-12-15
        • 2023-03-19
        • 1970-01-01
        • 2013-07-04
        相关资源
        最近更新 更多