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

时间:2014-04-17 08:38:40

标签: c# wpf layout

我正在构建一个我想要去设计的应用程序,它可以提醒一个dockpanel。

我想要的是,左侧(或左侧面板)的按钮代表应用程序的不同区域(例如" Milk"," Bread")然后有不同的& #34;视图"在中间小组。

我已经尝试过,使用" Frontpage"创建一个应用程序,然后按钮更改整个窗口/用户控件 - 但这不会给我静态区域/面板。

我不想使用tabtitemstrip是垂直的tabcontrol - 但它有点像我想要的功能。

有什么想法吗?

下面是一张带有希望设计的照片,有点想一想我的想法..任何帮助表示赞赏:)

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

2 个答案:

答案 0 :(得分:13)

如果您使用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并设置其.Template并将其设置为panel1,则会显示“胡萝卜”。如果你把它设置为panel3,驴子。等等。

它非常强大,但由于我不会涉及的其他一些事情,它不会非常方便。有书籍和教程深入解释模板。此外,此机制实际上并非设计用于此类任务。这是最基本的,如果你想在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将自动切换视图以及对CurrentThing的更改。

这是基础知识。在我试图简要介绍的几乎任何一点上,还有更多内容。现在,请离开ControlTemplates。阅读有关DataTemplates和Bindings的信息。阅读ContentPresenter(显示1个项目的1个模板)和ItemsControl(显示N个项目+模板)。然后,阅读MVVM模式。

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

但是,如果我没有提到所有费用都包括在内,我就不公平。与手动完成所有操作相比,模板和绑定的广泛使用使您的应用程序变得更慢。但通常情况下,手动操作并不值得。

答案 1 :(得分:0)

这是迄今为止我发现的解决此问题的最佳和最简单的解决方案。

https://azerdark.wordpress.com/2010/04/23/multi-page-application-in-wpf/