【问题标题】:Wpf custom window TabControl-like templateWpf 自定义窗口 TabControl 类模板
【发布时间】:2012-11-14 21:36:55
【问题描述】:

我想创建一个行为如下的CustomWindow 类: 1. 窗口的非客户区也被利用,TabControl 的标签出现而不是像谷歌浏览器中的窗口标题。 2. 选项卡是靠右填充的,所以当窗口太小时,最小/最大/关闭按钮不会与选项卡发生冲突——这在 TabControl 模板中应该是可行的。 3.标签后面有一个按钮,很像谷歌浏览器中的“新标签”按钮。同样,这应该可以通过 TabControl 的自定义实现来实现,并且我猜想创建一个假孩子进行渲染。 4. 我的类继承自 Window 类,并且 children 集合中的每个子项都映射到 TabControl 选项卡,就像 TabControl.ItemsSource 绑定到 Window.Children 一样。 5. Window 暴露了 ItemsSource 属性,其行为也类似于子集合。 6. Window 提供了一种方法来设置 TabControl 识别为 ItemTemplate 的样式。当我像CustomWindow.ItemsSource = new string[] { "a", "b", "c" }; 这样输入窗口并填充项目模板时,将创建三个选项卡,其中选项卡标题样式在 CustomWindow 类中硬编码,选项卡项目内容区域由用户模板化。

如您所见,这基本上是 Google Chrome 窗口的轮廓,这正是我想要完成的。我知道如何以我想要的方式弯曲窗口的镶边,处理系统菜单、双击最大化等。但是我不知道如何从 Window 继承类,这将迫使它是唯一的孩子成为我选择的 TabControl (标签标题是样式的),但实际上它的子集合将是 TabControls 子集合。我对 WPF 的经验并不如我所愿,我想以正确的方式开始,所以我以后不需要重写它。

另外,当这个问题解决后,我想给用户一种方法来告诉它被固定的选项卡,我猜这最好通过在 CustomWindow 中定义一个附加属性来完成,比如 CustomWindow.IsPinned 用于任何子控件?

谢谢。

【问题讨论】:

    标签: wpf custom-controls tabcontrol window-chrome


    【解决方案1】:

    将 DependencyProperty ItemsSource 添加到您的窗口(类型为 IEnumerable<object> 并在您的窗口模板中将 tabcontrol 设置为 ItemsSource="{TemplateBinding ItemsSource}"。这将使窗口拥有自己的子集合,然后将其呈现为选项卡控件。

    【讨论】:

    • 好的,但是如果我想要这样的东西怎么办: :CustomWindow> 如何使用一组控件来完成这项工作?谢谢你的回答,寿!
    • 我不明白你的问题。如果将选项卡定义为简单标签,选项卡项目将包含什么?另一方面,您可以使用 ContentPropertyAttribute msdn.microsoft.com/en-us/library/… 定义控件的内容属性是什么
    • 在这种情况下,标签应该是每个选项卡项的内容,标题为空。选项卡标题将通过其他一些机制 - 我正在考虑类似于 SelectedValuePath for ComboBox 的东西。感谢您的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多