Wpf设计;一个窗口内的多个视图

5
我正在开发一个应用程序,希望其设计类似于dockpanel。
我想在左侧(或左面板)放置不同区域的按钮(例如“牛奶”,“面包”),然后在中间面板中显示不同的“视图”。
我已经尝试过使用“首页”和更改整个窗口/用户控件的按钮来制作应用程序,但这样做将无法给我静态区域/面板。
我不想使用具有垂直tabtitemstrip的tabcontrol-但是它的功能与我所寻求的相似。
有什么想法吗?
下面是一个期望设计的图片,以便更好地理解我的想法..感谢任何帮助 :)

http://s57.photobucket.com/user/RolleKn/media/wpfdesign_zps3737b014.jpg.html


你实际上在问什么?你遇到了什么问题?你可以很容易地使用 Dock 面板来布局,但由于你已经提到过它,我想你指的是其他东西? - BenjaminPaul
1
哦,对了。我的问题是:我应该使用什么样的容器来容纳这些不同的“视图/页面”?我的意思是-例如,我可以在彼此之上放置不同的网格,然后根据按下的按钮使相应的网格可见/隐藏。 - rollekn
@rollekn 请看一下 Prism 库以及如何以 MVVM 的方式创建 WPF 的复合用户界面。 - Mashton
1个回答

21

如果你使用WPF,请使用ContainerControlContentPresenter

一般来说,“切换可见性”不是一个很好的方法。它会强制UI创建所有对象,即使那些不可见的对象,还要处理它们的数据和事件等等。

而且你需要手动切换它们。

在WPF中,提供了许多可以节省此过程的机制。其中有些更加智能,有些则不然。

WPF中最基本的机制之一是Control和其Template属性。你可以用单个Control替换整个Grid+Contents+SwitchingVisibility的想法,并切换它的Template

<Window.Resources>
    <ControlTemplate x:Key="panel1"> ..carrots.. </ControlTemplate>
    <ControlTemplate x:Key="panel2"> ..cucubers.. </ControlTemplate>
    <ControlTemplate x:Key="panel3"> ..donkey.. </ControlTemplate>
    ...
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <Control x:Name="foo" />
</Grid>

现在,如果你获取foo并设置它的.Templatepanel1,那么"carrots"就会显示出来。如果你将它设置为panel3,则是"donkeys"。依此类推。

虽然这很强大,但由于其他一些我不打算涉及的原因,它不会真正方便。有许多书籍和教程深入解释了模板。此外,这个机制并不是为这样的任务而设计的。它是最基本的机制,如果你想在WPF中工作,了解这一点是很好的,但这里有更合适的机制。

接下来第二个最强大且仍然基本的机制是ContentControl/ContentPresenter。它们几乎以相同的方式工作(实际上CC在内部使用CP),所以我会跳过它。

ContentControl是一个聪明的控件,它知道如何根据你要呈现的数据自动选择正确的模板

因此:

<Window.Resources>
    <DataTemplate DataType="CarrotData"> ..carrots.. </..>
    <DataTemplate DataType="CucumberData"> ..cucubers.. </..>
    <DataTemplate DataType="DonkeyData"> ..donkey.. </..>
    ...
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <ContentControl x:Name="foo" Content="{Binding ..}" />
</Grid>

请注意从“ControlTemplate”更改为“DataTemplate”。
现在,有了这个设置,您甚至不需要手动切换模板。您只需获取“foo”,将其内容设置为以下之一:

  • 一个包含与胡萝卜相关数据的CarrotData对象
  • 一个包含黄瓜相关数据的CucumberData对象
  • 一个包含驴子相关数据的DonkeyData对象

一旦设置要显示的数据(即foo.Content = carrots [5] ),ContentControl将选择要显示的相关模板。

您可以将Content属性绑定到几乎任何东西。如果您有一个包含胡萝卜/驴子并具有属性CurrentThing的数据类,您可以将其绑定到ContentControll,ContentControll会自动随着对CurrentThing的更改而切换视图。

那是基础知识。我试图简要介绍的几乎任何地方都有更多内容。现在,离开ControlTemplates。阅读有关DataTemplates和Bindings的信息。阅读ContentPresenter(显示1个项目的1个模板)和ItemsControl(显示N个项目+模板)。然后,稍微了解MVVM模式。

您很快就会发现,“将所有内容放入一个网格”和“切换可见性”是一种奇怪的方式。

但是,如果我不提到所有的成本,那就不公平了。广泛使用模板和绑定会使您的应用程序比手动完成的应用程序稍慢一些。但通常,手动完成并没有真正值得去做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接