WPF中自定义内容控件

9
我想我需要一堂关于WPF正确应用的讲座,但我愿意冒险尝试,因为我已经到了极限。我认为这可能主要是由于我懒得完全掌握WPF模板和样式,所以我很乐意听取任何这方面的讲座。
我正在编写一种音频编辑器/事件协调器。我已经有一个我比较满意的轨道编辑器。然而,我主要是使用自定义控件构建它的(我知道,这可能是WPF的罪过)。为了保持这个主题,我想为轨道制作一个标准头部,但我希望各个轨道“类型”能够定义该头部中包含的内容。我认为一个定义了边缘的“抓手”并允许实现者填充内容的控件会很好用。然而,我不知道如何在WPF中做到这一点,除非使用样式,即使最终使用样式,我也想理解这个过程。
这可能归结为想要一个简单ContentControl控件的典型实现(例如按钮),但找不到一个(除了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>

当然,这并不起作用。我相当确定我可以通过在幕后玩弄重载来实现同样的事情,但如果我能做些什么那就太好了。我真的必须将我的所有可怕的过程式方法放在身后,使用你说的这些样式吗?如果是这样,至少有人能告诉我框架中那个按钮长什么样吗?

2个回答

5

1
你不需要在样式和模板上花费太多心思。这只是达到目的的一种手段:让内部成为任意内容。因此,将你拥有的东西放在ControlTemplate中而不是UserControl中,最终结果正是你要寻找的。无需进行宗教转变! - Rick Sladkey
8
链接已失效。 - Kilazur
这个链接很好地解释了如何创建一个自定义控件。 - Poulpynator

1
使用样式可以将控件的功能与表示分离开来,例如Button
一开始将控件看作仅具有功能的东西。一个简单的类包含了预定义的事件、属性等。一旦该控件变成视觉树的一部分,它就需要一个视觉身份。之前它不需要,但现在需要了。定义一个默认样式可以让该控件现在拥有一个它之前没有的视觉表示,因为它之前并不在视觉树中。
忽略样式就像在使用HTML时忽略CSS一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接