加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:24:11 所属栏目:百科 来源:网络整理
导读:我正在建立一个应用程序,我想去设计,这可能会提醒一个dockpanel. 我想要的是,左侧(或左侧面板)的按钮代表应用程序的不同区域(例如“Milk”,“Bread”),然后在中间面板中具有不同的“视图”. 我已经尝试过,正在制作一个带有“Frontpage”的应用程序,以及更改
我正在建立一个应用程序,我想去设计,这可能会提醒一个dockpanel.

我想要的是,左侧(或左侧面板)的按钮代表应用程序的不同区域(例如“Milk”,“Bread”),然后在中间面板中具有不同的“视图”.

我已经尝试过,正在制作一个带有“Frontpage”的应用程序,以及更改整个窗口/用户控件的按钮 – 但这不会给我静态区域/面板.

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

有任何想法吗?

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

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

解决方法

如果您使用WPF,请使用ContainerControl或ContentPresenter.

通常,“切换可见性开/关”不是一个好方法.它强制UI创建所有对象,甚至是那些不可见的对象,并处理它们的数据和事件等.

你需要手动切换它.

WPF为您提供了许多可以为您节省的机制.有些人比其他人聪明,有些则没有.

WPF中最基本的机制之一是Control及其Template属性.您可以使用单个Control替换整个Grid Contents SwitchingVisibility概念并切换其模板:

<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模式的内容.

您很快就会发现“将所有内容都放在一个网格中”和“切换可见性”是一种奇怪的方法.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读