【问题标题】:Custom ContentControl in WPFWPF 中的自定义 ContentControl
【发布时间】:2010-12-27 04:04:51
【问题描述】:

我想我在这里要求一个关于 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>

当然,这行不通。我相当肯定我可以通过在幕后玩重载的技巧来完成同样的事情,但如果我能做这样的事情会很好。我真的必须把我所有糟糕的、程序化的方式抛在脑后,并使用你所说的这些风格吗?如果是这样,至少有人可以告诉我该按钮在框架中的外观吗?

【问题讨论】:

    标签: c# .net wpf wpf-controls


    【解决方案1】:

    这是一个从 ContentControl 派生以完成您想要的事情的完整示例:Creating Customized UserControls (Deriving from ContentControl) in WPF 4

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

    【讨论】:

    • 您不需要“全心全意”地使用样式和模板。这只是达到目的的一种手段:让内部成为任意内容。因此,将上面的内容放在 ControlTemplate 而不是 UserControl 中,最终结果正是您要寻找的。无需皈依宗教!
    • 链接已失效。
    【解决方案2】:

    使用样式允许您将控件的功能与控件的表示分开;比如Button

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多