【问题标题】:Closing just one expander within another expander in WPF/ VB.NET在 WPF/VB.NET 中仅关闭另一个扩展器中的一个扩展器
【发布时间】:2013-06-18 16:57:13
【问题描述】:

如果我搞砸了/忘记了一些东西,这里的第一个帖子很抱歉。 我正在使用 WPF 应用程序在 Visual Studio 2010 中工作,并且正在使用 VB.NET。

所以我有一个父扩展器,其中包含一个带有两个控件的网格:另一个扩展器和另一个网格。我在后面编写了一些代码,以使每个扩展器在折叠或关闭时变得不可见(以及其他一些事情),并在展开/打开时更改颜色/变得可见。我还在其他区域放置了一些按钮来完成相同的任务。我的问题是,当我折叠第二个扩展器时,第一个(父)扩展器也关闭/变得不可见。但是,用于折叠第二个扩展器的按钮可以完美地工作。这是我的相关代码(希望我的格式正确):

XAML

    <Expander Name="Expander1" Visibility="Hidden" >
        <Grid >
            <Grid.RowDefinitions >
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Expander Name="Expander2" Visibility="Hidden" >
                 <Content ...>
            </Expander>
            <Grid >
                <Grid.RowDefinitions>
                    <RowDefinition Height="20" />
                </Grid.RowDefinitions>
                <Content... />
            </Grid>
        </Grid>
    </Expander>

VB.NET

    Private Sub Expander2_Expanded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Expander2.Expanded

    Expander2.Background = Brushes.PaleTurquoise
    Expander2.BorderBrush = Brushes.Black

End Sub

    Private Sub Expander2_Collapsed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Expander2.Collapsed

    Expander2.IsExpanded = False
    Expander2.Background = Brushes.Transparent
    Expander2.BorderBrush = Brushes.Transparent
    Expander2.Visibility = Windows.Visibility.Visible
    ButtonA7.Visibility = Windows.Visibility.Visible
    Expander1.IsExpanded = True
    Expander1.Background = Brushes.PaleTurquoise
    Expander1.BorderBrush = Brushes.Black
    Expander1.Visibility = Windows.Visibility.Visible

End Sub

    Private Sub Expander1_Expanded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Expander1.Expanded

    Expander1.Background = Brushes.PaleTurquoise
    Expander1.BorderBrush = Brushes.Black

End Sub

    Private Sub Expander1_Collapsed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Expander1.Collapsed

    Expander1.Background = Brushes.Transparent
    Expander1.BorderBrush = Brushes.Transparent
    Expander1.Visibility = Windows.Visibility.Hidden
    ButtonA7.Visibility = Windows.Visibility.Visible

End Sub

不用担心代码中的所有按钮,这些按钮都可以正常工作。实际上,假设一个按钮与折叠扩展器完全相同,并且它可以正常工作。当您单击实际扩展器以折叠它时,我只需要发生同样的事情。这是按钮的代码,所以你看到它是相同的:

    Private Sub Button_Click_2(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)

    Expander2.IsExpanded = False
    Expander2.Background = Brushes.Transparent
    Expander2.BorderBrush = Brushes.Transparent
    Expander2.Visibility = Windows.Visibility.Visible
    Expander1.IsExpanded = True
    Expander1.Background = Brushes.PaleTurquoise
    Expander1.BorderBrush = Brushes.Black
    Expander1.Visibility = Windows.Visibility.Visible
    ButtonA7.Visibility = Windows.Visibility.Visible

End Sub

非常感谢您的帮助,我真的很感激!

编辑:或者,如果有一种简单的方法(我对 WPF 非常陌生......〜1周)隐藏/摆脱标题,那也可以工作。但如果可能的话,我更喜欢以前尝试过的另一种方式。谢谢!

【问题讨论】:

  • 尝试将 Expander2 和 Grid 放入 Grid 中的行和单元格中。
  • 另外,从 Expander2_Collapsed Sub 中删除“Expander2.IsExpanded = False”。
  • @Blam Yeh,我在第 0 行有扩展器 2,在第 1 行有网格,所以当扩展器 2 展开时,网格被向下推。抱歉应该包括在内,不过感谢您的回复!
  • @APrough 我已经尝试过使用那里的代码,事实上,如果我删除 Expander2_Collapsed Sub 的整个代码部分,当我折叠 Expander 2 时也会发生同样的事情,Expander 1 也关闭。事实上——即使我更改了代码,使 Expander2.IsExpanded = True,并且 Expander2 应该保持可见,同样的事情仍然会发生。好困惑哈哈..感谢您的回复!
  • 那里有很多。如果您将其简化为最简单的代码来重现问题,您将获得更多更好的响应。

标签: wpf vb.net visual-studio-2010 expander


【解决方案1】:

Expander.Collapsed Event 有路由策略冒泡。在事件到达 Expander1 之前将事件标记为已处理,一切都应该没问题。

Private Sub Expander2_Collapsed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Expander2.Collapsed
    ...
    e.Handled = True
End Sub

【讨论】:

  • 太棒了,坦克响应!让我试试看,我会尽快回复你。不幸的是,我也刚刚发布了这个问题的一个更简单的副本,如果我先看到这个就好了。编辑:太棒了!既然我知道这一点,你是否有机会提供一个简短的解释,说明你刚刚做了什么,或者可能是从哪里开始了解这个的好主意?非常感谢
  • 看看Routed Events Overview。 Collapsed 事件沿着从触发控件到可视根的可视树冒泡,并且此路由上的所有 Collapsed 处理程序也将处理此事件,除非您停止它。这就是e.Handled = True 所做的。
  • 哇,非常感谢!我真的很感谢所有的帮助。我希望我能投票支持你的回复哈哈,但我太了解用户了,一旦我获得声誉,我一定会回来做的:)
猜你喜欢
  • 2012-09-16
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多