Wpf自定义窗口TabControl式模板

时间:2012-11-14 21:36:56

标签: wpf custom-controls tabcontrol window-chrome

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

正如您所看到的,这基本上是Google Chrome窗口的大纲,这正是我想要完成的。我知道如何以我想要的方式弯曲窗口的chrome,如系统菜单,双击最大化等处理。但是我不知道如何从Window中创建继承类,它将强制它唯一的子项成为我选择的TabControl(标签标题被设置样式)但实际上它的子集合将是TabControls子集合。我对WPF的体验并不像我想的那么多,我想以正确的方式开始,所以我不需要在将来重写它。

另外,当这个问题得到解决时,我想让用户告诉它固定的标签,我想最好通过在CustomWindow中定义一个附加属性来实现,比如CustomWindow.IsPinned用于任何子控件?

谢谢。

1 个答案:

答案 0 :(得分:1)

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