C# WPF中的自定义ContentControl

C# WPF中的自定义ContentControl,c#,.net,wpf,wpf-controls,C#,.net,Wpf,Wpf Controls,我想我是在要求一个关于WPF正确应用的讲座,但我要抓住机会,因为我已经智穷了。我想这很大程度上是因为我对完全接受WPF模板和样式的懒散,所以我很乐意听任何这样的讲座 我在写一种音频编辑器/事件编排器。我有一个我很满意的曲目编辑器。然而,我基本上是用自定义控件构建的(我知道,这可能是WPF的一个缺点)。为了与这个主题保持一致,我想为这些曲目制作一个标准的标题,但我希望各个曲目的“类型”能够定义标题中的内容。我认为一个控件在边缘定义了一种“抓地力”,然后允许实现者“填充”实体,它会很好地工作。然而,

我想我是在要求一个关于WPF正确应用的讲座,但我要抓住机会,因为我已经智穷了。我想这很大程度上是因为我对完全接受WPF模板和样式的懒散,所以我很乐意听任何这样的讲座

我在写一种音频编辑器/事件编排器。我有一个我很满意的曲目编辑器。然而,我基本上是用自定义控件构建的(我知道,这可能是WPF的一个缺点)。为了与这个主题保持一致,我想为这些曲目制作一个标准的标题,但我希望各个曲目的“类型”能够定义标题中的内容。我认为一个控件在边缘定义了一种“抓地力”,然后允许实现者“填充”实体,它会很好地工作。然而,我不知道在WPF中如何在不使用样式的情况下做到这一点,即使我最终使用了样式,我也想理解这一点

这可能归结为想要一种简单ContentControl控件(例如按钮)的示例实现,而找不到一个(除了AvalonDock,AvalonDock最终使用了(我相信是正确的)模板)。在我看来,xaml看起来像这样:

<ContentControl x:Class="TestArea.CustomContentControl2"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Hello"/>
    <ContentPresenter Grid.Column="1"/>
</Grid>


但当然,这是行不通的。我相当肯定我可以通过在幕后玩重载的把戏来完成同样的事情,但如果我能做这样的事情那就太好了。我真的必须把我所有糟糕的程序性方法抛在脑后,使用你提到的这些风格吗?如果是这样,至少有人能告诉我框架中的按钮是什么样子吗?

使用样式可以将控件的功能与控件的表示分离;比如,

在开始时将其视为一个控件,而不是功能。包含预定义事件、属性等的简单类。。。一旦该控件承担起成为可视树一部分的任务,它现在就需要一个可视标识。它以前不需要一个;但现在它确实如此。定义默认样式允许该控件现在有一个它以前不需要的可视化表示,因为它不在可视化树中


忽略样式就像在使用HTML时忽略CSS一样。

下面是一个从ContentControl派生来实现所需功能的完整示例:


Pete的ContentPresenter正在做与您的示例中相同的事情。

您不需要对样式和模板“全力以赴”。这只是达到目的的一种手段:让内部成为任意内容。因此,将上面的内容放在ControlTemplate中,而不是UserControl中,最终结果正是您想要的。不需要宗教皈依!链接已断开。