Wpf设计;在一个窗口中显示多个视图
本文关键字:窗口 显示 视图 一个 Wpf 设计 | 更新日期: 2023-09-27 17:58:40
我正在构建一个应用程序,我想去那里进行设计,这可能会让人想起dockpanel。
我想要的是,在左侧(或左侧面板)有代表应用程序不同区域的按钮(例如"牛奶"、"面包"),然后在中间面板中有不同的"视图"。
我已经尝试过的是,制作一个带有"Frontpage"的应用程序,并通过按钮更改整个窗口/用户控件——但这不会给我静态区域/面板。
我不想使用tabtitemstrip是垂直的tabcontrol,但它有点像我想要的功能。
有什么想法吗?
下面是一张带有愿望设计的图片,让我了解一下我的想法。。感谢任何帮助:)
http://s57.photobucket.com/user/RolleKn/media/wpfdesign_zps3737b014.jpg.html
如果使用WPF,请使用ContainerControl
或ContentPresenter
。
一般来说,"打开/关闭可见性"不是一个好方法。它强制UI创建所有对象,甚至是那些不可见的对象,并处理它们的数据和事件等。
你需要手动切换。
WPF为您提供了许多机制,可以为您节省这一点。有些人比其他人聪明,有些人则不然。
WPF中最基本的机制之一是Control
及其Template
性质。你可以用一个Control
和切换它的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
,驴子。等等。
它非常强大,但由于其他一些我不会介绍的事情,它不会真正方便。有一些书和教程可以深入解释Templates。此外,此机制确实不是为此类任务设计的。这是最基本的一个,如果你想在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。阅读有关数据模板和绑定的信息。阅读ContentPresenter(显示1个项目的1个模板)和ItemsControl(显示N个项目+模板)。然后,阅读一下MVVM模式。
你很快就会发现"把所有东西都放在一个网格中"answers"切换可见性"是一种奇怪的方法
然而,如果我没有提到每件事都包含成本,那就不公平了。与手动执行所有操作相比,模板和绑定的广泛使用会使您的应用程序速度慢一些。但通常情况下,手动操作并不值得