扩展器标头的宽度会影响外部的滚动查看器

时间:2015-02-10 14:25:10

标签: c# wpf styling

以下是我的代码

<Window x:Class="ScrollTester.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>

这里我为堆栈面板中使用的扩展器的头设置了datatemplate

    <DataTemplate x:Key="titleText">
        <Border Background="Green" Height="24">
            <TextBlock Text="{Binding}" 
                    Width="{Binding
                    RelativeSource={RelativeSource
                    Mode=FindAncestor,
                    AncestorType={x:Type Expander}},
                    Path=ActualWidth}"/>
        </Border>
    </DataTemplate>
    <Style TargetType="{x:Type Expander}">
        <Setter Property="Margin" Value="1,3"/>
        <Setter Property="BorderBrush" Value="Gray"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="HeaderTemplate" Value="{StaticResource titleText}"/>
    </Style>
</Window.Resources>

我有一个用于堆栈面板的滚动查看器

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <StackPanel>
        <Expander IsExpanded="True" x:Name="general" Header="General">
            <StackPanel Orientation="Horizontal">
                <GroupBox Header="Mode Control">
                    <StackPanel>
                        <CheckBox Content="RESET"/>
                        <CheckBox Content="MAKEUP" IsChecked="True"/>
                        <CheckBox Content="POWERDOWN"/>
                    </StackPanel>
                </GroupBox>
                <GroupBox Header="Mode Control">
                    <StackPanel>
                        <CheckBox Content="RESET"/>
                        <CheckBox Content="MAKEUP" IsChecked="True"/>
                        <CheckBox Content="POWERDOWN"/>
                    </StackPanel>
                </GroupBox>
                <GroupBox Header="Mode Control">
                    <StackPanel>
                        <CheckBox Content="RESET"/>
                        <CheckBox Content="MAKEUP" IsChecked="True"/>
                        <CheckBox Content="POWERDOWN"/>
                    </StackPanel>
                </GroupBox>
                <GroupBox Header="Mode Control">
                    <StackPanel>
                        <CheckBox Content="RESET"/>
                        <CheckBox Content="MAKEUP" IsChecked="True"/>
                        <CheckBox Content="POWERDOWN"/>
                    </StackPanel>
                </GroupBox>
                <GroupBox Header="Mode Control">
                    <StackPanel>
                        <CheckBox Content="RESET"/>
                        <CheckBox Content="MAKEUP" IsChecked="True"/>
                        <CheckBox Content="POWERDOWN"/>
                    </StackPanel>
                </GroupBox>
            </StackPanel>
        </Expander>
    </StackPanel>
</ScrollViewer>

这里的问题是即使堆叠面板的宽度更大,滚动条也不起作用。

我可以理解为什么会发生这种情况,因为将扩展器的宽度设置为其父级,因此滚动条不起作用

但我希望滚动条工作和启用以及带标题样式的datatemplate

任何人都可以提供解决方案吗?

1 个答案:

答案 0 :(得分:0)

您尝试做的事情不会起作用,因为扩展程序标题的宽度还包括用于展开和折叠控件的按钮。

以这种方式思考:控件的标题区域包含两个并排的元素,展开/折叠按钮和标题&#34;内容&#34;。您将标题内容部分(您的Border元素)的宽度绑定到扩展器控件的宽度,但这并不会减去展开/折叠按钮的宽度。因此你的布局会中断。

如果标题内容部分位于后面展开/折叠按钮,那么您的方法可行,但不幸的是,这不是默认Expander控件模板的设计方式。< / p>

我只是猜测,但在我看来,你只是想设置扩展器的背景颜色。不幸的是,再次由于默认控制模板,这是不可能的:

  • 如果你设置了扩展器的Background属性,这个改变标题的颜色,但它也会改变内容区域的颜色,这可能不是& #39; t你想要什么

  • 在标题中添加另一个元素(例如您的Border)并尝试将其放入&#34;延伸&#34;到控件的宽度(通过将HorizontalContentAlignment属性设置为Stretch)也不会起作用,因为放置标题的元素在控件模板中被硬编码为左对齐。

据我所知,实现所需内容的唯一方法是为扩展器编写自己的控件模板并使用它。你应该可以在SO或谷歌上找到一些这方面的例子。