【问题标题】:Expand/Collapse of a nested WPF Grid展开/折叠嵌套的 WPF 网格
【发布时间】:2012-06-01 12:28:49
【问题描述】:

我创建了一个嵌套的 WPF 数据网格。我看到您可以通过单击该行来展开它,但是当您执行相同操作时它不会折叠。

几个问题:

  1. 用户如何折叠网格?
  2. 有没有办法在父行上获取展开/折叠按钮?
  3. 当您单击不同的父级展开时,它会折叠您所在的前一个父级。有没有办法让网格保持你制作的方式。即,如果我展开第 1 行然后转到第 3 行,第 1 行将保留在我展开的位置。

谢谢, 格雷格

【问题讨论】:

    标签: c# wpf wpfdatagrid


    【解决方案1】:

    有几种方法可以达到这种行为。 例如 Expand/Collapse button in a Silverlight DataGrid.

    如果您更喜欢xaml,请使用:

    <Style x:Key="ExpandableDataGridRowHeaderStyle"
               TargetType="sdk:DataGridRowHeader">
        <Setter Property="Background"
                    Value="#99E9EEF4" />
        <Setter Property="IsTabStop"
                    Value="False" />
        <Setter Property="SeparatorBrush"
                    Value="#FFFFFFFF" />
        <Setter Property="SeparatorVisibility"
                    Value="Collapsed" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="sdk:DataGridRowHeader">
                    <Grid x:Name="Root">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="25" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>                           
                        <Border BorderBrush="#FFFFFFFF"
                                    BorderThickness="1,0,1,0"
                                    Grid.ColumnSpan="2"
                                    Grid.RowSpan="3">
                            <Grid>
                                <Rectangle x:Name="RowInvalidVisualElement"
                                               Grid.ColumnSpan="2"
                                               Fill="#FFF7D8DB"
                                               Opacity="0"
                                               Grid.RowSpan="3"
                                               Stretch="Fill" />
                                <Rectangle x:Name="BackgroundRectangle"
                                               Grid.ColumnSpan="2"
                                               Fill="Transparent"
                                               Grid.RowSpan="3"
                                               Stretch="Fill" />
                            </Grid>
                        </Border>
                        <Button Background="{x:Null}"
                                    BorderBrush="{x:Null}"
                                    BorderThickness="0"
                                    Padding="0"
                                    Grid.RowSpan="1"
                                    HorizontalAlignment="Stretch">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Click">
                                    <AttachedBehaviors:ExpandButtonAction/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Button>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    AttachedBehavior 实际上会改变DetailsVisibility

    public class ExpandButtonAction : TargetedTriggerAction<FrameworkElement>
    {
        #region Invoke
    
        protected override void Invoke(object parameter)
        {
            RoutedEventArgs eventArgs = (RoutedEventArgs) parameter;
            Button bsender = eventArgs.OriginalSource as Button;
            var row = DataGridRow.GetRowContainingElement(eventArgs.OriginalSource as FrameworkElement);
            if (row.DetailsVisibility == Visibility.Visible)
            {
                row.DetailsVisibility = Visibility.Collapsed;
            }
            else
            {
                row.DetailsVisibility = Visibility.Visible;
            }
        }
    
        #endregion
    }
    

    并将其应用于DataGrid 中的RowHeaderStyle,您要在其中展开/折叠DetailsTemplate

    【讨论】:

    • 本例中的 sdk 命名空间是什么?
    • 我必须为此安装一些东西吗?它找不到 DataGridFrozenGrid。
    • 是的,我发现了。但是我的 xaml 说它找不到您在上面提供的命名空间的 DataGridFrozenGrid。我想知道是不是因为我在做 WPF,而不是 Silverlight。
    【解决方案2】:

    使用 WPF 扩展器。这样您就可以扩展内部 DataGrid。

    【讨论】:

    • 我试过扩展器,但它看起来像垃圾。你把它放在哪里?
    • 您必须为 wpf 创建一个 xaml 样式并在其中放置扩展器。
    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多