ContentControl与内容周围的控件

时间:2014-05-15 14:34:14

标签: c# wpf custom-controls

我想在WPF中创建一个可以包含一个元素的自定义ContentControl。这很容易,我已经做了很多次。但是在这里我希望内容控件在底部和左边都有标尺。我希望可以从后面的代码访问这些控件。我对如何前进感到茫然。我已经考虑了一个模板,但是后面的标尺控件不容易访问。我还考虑过创建一个带有依赖属性等内容的UserControl,但是对于这个控件的用户而言,XAML并不像使用内容控件那么简单。

感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用模板部件。您可以在此页面上查看完整的示例:

http://msdn.microsoft.com/en-us/library/ee330302(v=vs.110).aspx

从示例中,CustomControl声明模板部分的方式如下:

[TemplatePart(Name = "UpButtonElement", Type = typeof(RepeatButton))] [...] public class NumericUpDown : Control [...]

以及如何访问它们:

  public override void OnApplyTemplate()
    {
        UpButtonElement = GetTemplateChild("UpButton") as RepeatButton;
        [...]
    }

答案 1 :(得分:0)

您要求的是能够以常用的两种不同方式使用内容,但同时使用一个控件。您可以这样做,但只需要2个不同的内容属性。您可以定义自己的辅助内容属性集,但只是从HeaderContentControl派生出来更容易,Header已经完全针对您的ContentControl属性。

要允许该控件的用户将其视为普通Header并将其封装在代码中,您可以使用UserControl内容作为您定义ContentPresenter样式的部分可以从代码隐藏访问。在该内容中,您只需将Content放在您希望接收外部ControlTemplate的任何位置即可。然后,您还需要调整Header以仅显示Content内容(Header部分将在<HeaderedContentControl x:Class="WpfApp.MyRulerControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApp"> <HeaderedContentControl.Template> <ControlTemplate TargetType="{x:Type local:MyRulerControl}"> <Border Background="{TemplateBinding Background}"> <ContentPresenter ContentSource="Header"/> </Border> </ControlTemplate> </HeaderedContentControl.Template> <HeaderedContentControl.Header> <StackPanel> <Border x:Name="Ruler1" Height="20"/> <ContentPresenter Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyRulerControl}}, Path=Content}" ContentTemplate="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyRulerControl}}, Path=ContentTemplate}"/> <Border x:Name="Ruler2" Height="20"/> </StackPanel> </HeaderedContentControl.Header> </HeaderedContentControl> 部分内)。

<local:MyRulerControl>
    <TextBlock Text="External content here"/>
</local:MyRulerControl>

现在您可以像往常一样使用控件:

Header

您还可以从代码隐藏中获取 public MyRulerControl() { InitializeComponent(); Ruler1.Background = Brushes.Red; Ruler2.Background = Brushes.Blue; } 部分内的任何内容:

{{1}}