我是WPF的新手,我想知道我是否可以使用与WinForms中使用的方法相同的方法。
我希望在UserControl(如向导)中拥有可切换的内容,我希望能够设计此控件中的所有页面(在VS设计器中,xaml编辑器中) 。我希望在其真正的容器中看到内容(每个页面)。
我不希望将每个页面放在单独的UserControl文件上,我不希望它们共享相同的空间(UserControl的客户区域),这就是你的情况除了当前显示的那个(在运行时)之外,它们都是不可见的。
在WinForms中,我可以通过VS表单设计器中的按钮切换页面。我甚至可以自己创建这样的控件(按钮在设计时工作)。有没有办法在WPF中做同样的事情?我只是不能接受我必须为同一控件的每个页面创建一个新文件的想法......
谢谢!
答案 0 :(得分:2)
如上述评论中所述,TabControl非常适合您的需求。
Visual Studio WPF Designer允许您在设计时可视化每个TabItem
的内容:
只需单击TabItem的标题,或将其各自的XAML标记聚焦在XAML编辑器中:
<TabControl>
<TabItem Header="Tab Item #1"> <!-- Placing the keyboard cursor here will show Tab Item 1-->
<Border Background="Red"/>
</TabItem>
<TabItem Header="Tab Item #2"> <!-- Placing the keyboard cursor here will show Tab Item 2-->
<Border Background="Green"/>
</TabItem>
</TabControl>
如果您不想显示标签标题,只需将TabControl的Template自定义为仅显示SelectedContent
,如下所示:
<TabControl>
<TabControl.Template>
<ControlTemplate TargetType="TabControl">
<ContentPresenter Content="{TemplateBinding SelectedContent}"/>
</ControlTemplate>
</TabControl.Template>
<!-- TabItems here -->
</TabControl>
这个简单的自定义通过XAML编辑器中的键盘光标保留了设计时预览功能,同时仅在UI中显示所选TabItem的内容,没有任何标题。
所有这些都说,作为一个评论,你真的需要留下古老的winform心态。
首先,在WPF的任何上下文中都没有“错误控制”这样的东西。 WPF Content Model允许几乎任何父容器在几乎任何情况下组成丰富内容,从而实现比古老技术更大的可定制性。
不,TabControl
(WPF中没有TabPage
这样的东西)不“只接受TabItems”,因为,就像任何其他ItemsControl一样,{ {1}}将每个项目包装在Item Container中,前提是该项目本身不是项目容器。
这意味着,如果您将TabControl
作为<Checkbox/>
的项目放置,WPF会自动将TabControl
包裹为Checkbox
。此行为支持各种场景,并允许高级别的可定制性和复杂用途(如DataBinding和Data Templating),而无需引入自定义代码。与某些古老的技术相比,例如winforms,除了默认的可怕内容之外,它们几乎不支持任何东西,并且不支持DataBinding。
如果您在理解WPF布局时遇到问题,请参阅This Tutorial。由于WPF的像素独立性,在WPF中(与无用的winforms相比)更容易实现复杂的,与分辨率无关的布局。