【发布时间】: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