【问题标题】:Horizontal aligment WPF expander header水平对齐 WPF 扩展器标题
【发布时间】:2017-04-03 09:38:29
【问题描述】:

我想在左侧显示我的 GroupName,在标题行右侧显示“ShowOnly”按钮。 我尝试使用此代码但不起作用。 有人可以帮我吗? 谢谢

我的代码:

<Expander IsExpanded="True" >
    <Expander.Header>
        <DockPanel HorizontalAlignment="Stretch">
            <TextBlock Text="{Binding Path=Name}" FontSize="18"></TextBlock>
            <Button Style="{StaticResource ButtonStyle}" Content="Show Only" HorizontalAlignment="Right" Padding="15,0,15,0" Click="Button_Click"></Button>
        </DockPanel>
    </Expander.Header>
    <Expander.Style>
        <Style TargetType="{x:Type Expander}">
            <Setter Property="Background" Value="#f0f0f5"></Setter>
            <Setter Property="TextElement.FontFamily" Value="Arial Nova"/>
        </Style>
    </Expander.Style>
    <Expander.Content>
        <ItemsPresenter />
    </Expander.Content>
</Expander>

我的按钮样式:

<Style x:Key="ButtonStyle" TargetType="Button">

            <Setter Property="Background" Value="#66e0ff" />
            <Setter Property="Foreground" Value="White" />
            <Setter Property="FontSize" Value="15" />
            <Setter Property="SnapsToDevicePixels" Value="True" />

            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border CornerRadius="4" Background="{TemplateBinding Background}">
                            <Grid>
                                <ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="White" />
                                <Setter Property="Foreground" Value="#66e0ff" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

    </Style>

我也尝试使用 DockPanel,但结果相同。

【问题讨论】:

  • 这里的 GroupName 是什么?
  • @Parag

标签: c# wpf header styles expander


【解决方案1】:

您需要将Expander的默认控件模板中定义的ContentPresenterHorizontalAlignment属性设置为Stretch

最简单的方法可能是处理ExpanderLoaded 事件并使用在可视化树中找到ContentPresenter 的辅助方法:

private void Expander_Loaded(object sender, RoutedEventArgs e)
{
    Expander expander = sender as Expander;
    System.Windows.Controls.Primitives.ToggleButton HeaderSite = GetChildOfType<System.Windows.Controls.Primitives.ToggleButton>(expander);
    if (HeaderSite != null)
    {
        ContentPresenter cp = GetChildOfType<ContentPresenter>(HeaderSite);
        if (cp != null)
            cp.HorizontalAlignment = HorizontalAlignment.Stretch;
    }
}

private static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj == null) return null;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        var child = VisualTreeHelper.GetChild(depObj, i);

        var result = (child as T) ?? GetChildOfType<T>(child);
        if (result != null) return result;
    }
    return null;
}

<Expander IsExpanded="True" Loaded="Expander_Loaded">
    <Expander.Header>
        <DockPanel HorizontalAlignment="Stretch">
            <Button Style="{StaticResource ButtonStyle}" Content="Show Only" DockPanel.Dock="Right" Padding="15,0,15,0" Click="Button_Click"></Button>
            <TextBlock Text="{Binding Path=Name}" FontSize="18"></TextBlock>
        </DockPanel>
    </Expander.Header>
    <Expander.Style>
        <Style TargetType="{x:Type Expander}">
            <Setter Property="Background" Value="#f0f0f5"></Setter>
            <Setter Property="TextElement.FontFamily" Value="Arial Nova"/>
        </Style>
    </Expander.Style>
    <Expander.Content>
        <ItemsPresenter />
    </Expander.Content>
</Expander>

【讨论】:

    【解决方案2】:

    将 DockPanel 的宽度设置为扩展器的宽度,以便正确拉伸。

    <DockPanel HorizontalAlignment="Stretch" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=ActualWidth}">
    

    【讨论】:

    • 请注意,此解决方案使标题元素比可用空间更宽,因为未考虑 ToggleButton 的宽度。
    【解决方案3】:
    猜你喜欢
    • 2012-11-07
    • 2020-01-08
    • 2011-01-26
    • 2012-09-12
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多