【问题标题】:WPF Expander.Header horizontal stretchWPF Expander.Header 水平拉伸
【发布时间】:2015-07-01 12:39:19
【问题描述】:

我在 Wpf 中有一个扩展器。在标题中,我有左对齐的标签,并希望在正确的站点上有一个按钮。我使用以下 XAML:

<Expander HorizontalAlignment="Stretch" IsExpanded="True">
    <Expander.Header >
        <Grid HorizontalAlignment="Stretch" Background="Aqua" Margin="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0" Content="Label on the left site"/>
            <Button Grid.Column="1" Content="Button on the right"/>
         </Grid>
    </Expander.Header>
    <Label Content="Some Content"/>
</Expander>

但这不起作用。标题中的按钮左对齐,靠近标签。 谁能解释一下我该怎么做?

【问题讨论】:

标签: c# wpf xaml expander


【解决方案1】:

Expander 标头内容展示器的水平对齐方式设置为 Left

您可以使用HorizontalAlignmentOneWayToSource 绑定将其更改为Stretch(默认情况下Stretch 对应Grid),如下所示:

<Expander>
    <Expander.Header>
        <Grid Background="Yellow">
            <TextBlock Text="Header"
                       HorizontalAlignment="{Binding HorizontalAlignment, RelativeSource={RelativeSource AncestorType=ContentPresenter}, Mode=OneWayToSource}" />
        </Grid>
    </Expander.Header>
</Expander>

P.S.:理解接受答案的解决方案花了我更多的时间,所以我决定为未来的读者节省时间。

【讨论】:

  • 这应该是被接受的答案,因为这并不建议您需要更改标题模板。
  • 这是唯一有效且干净的答案,应该被接受
  • 我同意这应该是公认的答案。但是绑定应该定义在Grid,而不是TextBlock
  • ContentPresenter 上的对齐对我有帮助。在我的自定义扩展器模板中修复了这个问题!
【解决方案2】:

我能够使用下面提供的 xaml 在标题中拉伸内容。基本上,我将网格 Horizo​​ntailAlignment 数据绑定到内容呈现器祖先。不幸的是,scher 提供的解决方案(数据绑定到 ActualWidth)可能会导致 ui 元素显示得比容器更宽,从而导致控件被部分切断。) Bolu 到文章“Stretching Content in an Expander Header”的链接使用后面的代码,如本例使用纯xml。

<ItemsControl x:Name="ItemGroups" Grid.Column="2" Grid.Row="0"   ItemsSource="{Binding Model.ItemGroups}" ScrollViewer.VerticalScrollBarVisibility="Auto" >
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Expander Margin="4,0"   Header="{Binding}">
                        <Expander.HeaderTemplate>
                            <DataTemplate>
                                <Grid  HorizontalAlignment="{Binding Path=HorizontalAlignment, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Mode=OneWayToSource}" >
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition   />
                                        <ColumnDefinition  Width="Auto"/>
                                        <ColumnDefinition  Width="64"/>
                                    </Grid.ColumnDefinitions>

                                    <TextBox Grid.Column="0"  Text="{Binding Name, Mode=TwoWay}" />
                                    <TextBlock Grid.Column="1" Text="{Binding TotalCostString}" Margin="4,0"/>
                                    <Button Grid.Column="2" Command="{Binding DataContext.RemoveItemGroup, ElementName=ItemGroups, Mode=OneWay}" CommandParameter="{Binding}" Content="Remove"/>
                                </Grid>         
                            </DataTemplate>
                        </Expander.HeaderTemplate>
                        <Expander.Content>
                            <TextBlock Text="{Binding Summary}"></TextBlock>
                        </Expander.Content>
                    </Expander>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

【讨论】:

  • 谢谢,我只是在看这个话题,看到了你的答案。我没有想到这一点,但我确认这是可行的。这有点额外的 xaml 代码,但很高兴只有 xaml。我还绑定到标题中的实际宽度,但这有点太大了。我可以使用转换器并调整宽度宽度,例如例如,2 像素的边框,但这会更“静态”但代码更短:)
  • 这是否有效,因为Grid.HorizontalAlginment 的默认值为Stretch
  • 这个解决方案也可以,当扩展按钮放在右侧时,就像answer of ray中提到的那样。
  • 我有一个关于自定义 DataGrid 标题的类似问题,其中标题没有根据列宽调整大小。正如我发现的那样,这里的方法也适用于 DataGrid 标头。
【解决方案3】:

我采用了 Bolu 链接的解决方案之一。结果如下:

    <Expander HorizontalAlignment="Stretch" IsExpanded="True">
        <Expander.Header >
            <!-- Width-Binding is needed, to fill the whole header horizontally-->
            <Grid HorizontalAlignment="Stretch" Background="Aqua" Margin="0" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=ActualWidth}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Content="Label on the left site"/>
                <!-- Margin is needed, to bring the Button into the view -->
                <Button Grid.Column="1" Content="Button on the right" Margin="0,0,40,0"/>
            </Grid>
        </Expander.Header>
        <Label Content="Some Content"/>
    </Expander>

【讨论】:

    【解决方案4】:

    *Heck:右填充到例如100000:Padding="2 2 100000 2"

    <Expander Name="Name" ExpandDirection="Down">
        <Expander.Header>
            <TextBlock Text="Expander..." Margin="0 5" Padding="2 2 100000 2" />
        </Expander.Header>
    </Expander>
    

    【讨论】:

      【解决方案5】:

      如果您不想更改扩展器标题,您也可以使用在加载标题时修改 Horizo​​ntalAlignment 的行为(System.Windows.Interactivity)

      internal class StretchingExpanderHeaderBehavior : Behavior<Expander>
      {
          protected override void OnAttached()
          {
              AssociatedObject.Loaded += StretchHeader;
          }
      
          private void StretchHeader(object sender, RoutedEventArgs e)
          {
              DependencyObject header = AssociatedObject.Header as DependencyObject;
              if (header != null)
              {
                  ContentPresenter contentPresenter = VisualTreeHelper.GetParent(header) as ContentPresenter;
                  if (contentPresenter != null)
                  {
                      contentPresenter.HorizontalAlignment = HorizontalAlignment.Stretch;
                  }
              }
          }
      }
      

      这可以附加到扩展器上

      <Expander>
          <Expander.Header>
              <DockPanel HorizontalAlignment="Stretch">
                  <Button DockPanel.Dock="Right" Content="Button on the right" />
                  <Label Content="Label on the left site"/>
              </DockPanel>
          </Expander.Header>
      
          <Border BorderBrush="LightGray" BorderThickness="1">
              <ItemsPresenter />
          </Border>
      
          <iy:Interaction.Behaviors>
              <bhv:StretchingExpanderHeaderBehavior />
          </iy:Interaction.Behaviors>
      
      </Expander>
      

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 2018-07-13
        • 2012-11-05
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多