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