向现有控件添加标题

时间:2011-05-04 13:27:54

标签: wpf controls

我想创建一个行为与ListBox完全相同的自定义控件类型,只不过它显示的标题高于它。

我认为我需要做的是继承ListBox并使用如下代码:

var originalTree = Template.VisualTree;

var panel = new FrameworkElementFactory(typeof(StackPanel));

var heading = new FrameworkElementFactory(typeof(TextBlock));
heading.SetValue(TextBlock.TextProperty, "Heading");

panel.AppendChild(heading);
panel.AppendChild(originalTree);

Template.VisualTree = panel;

除非我尝试放置它,否则它无效,因为Template.VisualTreenull。我做错了什么?

2 个答案:

答案 0 :(得分:1)

据我所知,模板可以通过各种方式定义,如果VisualTreenull,则它是“通过引用”生成的,在这种情况下,它已设置为{{3 }}

编辑意图,所有成员都是内部或私人

如果要打算使用整个root,我会使用UserControl。


编辑:复制和编辑默认模板也应该没问题,这是默认样式:

    <SolidColorBrush x:Key="ListBorder" Color="#828790"/>
    <Style TargetType="{x:Type ListBox}">
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBox}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
                        <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

(您可以将标题TextBox.Text绑定到ListBox.Tag,然后您不需要将其子类化)

默认模板和样式为Frameworktemplate.Template

答案 1 :(得分:0)

本文http://www.wpftutorial.net/CustomVsUserControl.html意味着UserControl是几个控件的集合体 - 在您的情况下是Label或TextBlock加上ListBox?那么用户是否可以控制可能的解决方案?