Wpf设计;在一个窗口中显示多个视图

本文关键字:窗口 显示 视图 一个 Wpf 设计 | 更新日期: 2023-09-27 17:58:40

我正在构建一个应用程序,我想去那里进行设计,这可能会让人想起dockpanel。

我想要的是,在左侧(或左侧面板)有代表应用程序不同区域的按钮(例如"牛奶"、"面包"),然后在中间面板中有不同的"视图"。

我已经尝试过的是,制作一个带有"Frontpage"的应用程序,并通过按钮更改整个窗口/用户控件——但这不会给我静态区域/面板。

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

有什么想法吗?

下面是一张带有愿望设计的图片,让我了解一下我的想法。。感谢任何帮助:)

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

Wpf设计;在一个窗口中显示多个视图

如果使用WPF,请使用ContainerControlContentPresenter

一般来说,"打开/关闭可见性"不是一个好方法。它强制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"切换可见性"是一种奇怪的方法

然而,如果我没有提到每件事都包含成本,那就不公平了。与手动执行所有操作相比,模板和绑定的广泛使用会使您的应用程序速度慢一些。但通常情况下,手动操作并不值得