问题标签 [layoutpanels]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
76 浏览

gwt - GWT 中的面板与 LayoutPanles

我是 GWT 的新手。我想知道何时使用面板以及何时使用布局面板。我真的很困惑。谁能提供一个合法的用例,我们需要使用面板而不是布局面板,反之亦然? 。谢谢。

0 投票
0 回答
52 浏览

jquery-mobile - Jquery Mobile 如何在他们的文档中制作一个不可关闭的面板?

这个 JQM GitHub 页面上,有人询问是否要同时打开两个面板。每当在网上问这个问题时,通常的答案是,这对于 JQM 来说基本上是不可能的,而且无论如何通常是不可取的,这里也不例外。但是,说这话的同一位开发人员提到:

您可能想看看我们如何为我们的演示做同样的事情。左侧的菜单是一个面板,但我们使用一些自定义 CSS 使其内容在更宽的屏幕上始终可见。在右侧,我们有一个用于搜索的覆盖面板。

我已经看遍了那个页面。侧边菜单确实是一个菜单,而且似乎无法关闭。我进入了

在 Chrome 控制台中,除了在 concole 中返回未更改的元素之外没有任何效果,而打开搜索面板然后用“搜索”代替“navmenu”执行相同的命令将明显关闭搜索面板。

我不知道做了什么才能做到这一点。我想在我的项目上复制相同的效果:如果屏幕很宽(实际上只是侧边栏),则两个面板无法关闭,但在较小的屏幕上表现正常。

对于它的价值,面板上的文档列出了一种以编程方式打开两个面板的方法,但我无法让它工作,编写上述内容的同一位开发人员也表示JQM CSS 不支持这一点,该方法应该从文档中删除。

0 投票
2 回答
945 浏览

c# - 如何为新的面板类重用现有的布局代码?

tl;dr:我想为自定义 WPF 面板类重用预定义WPF 面板的现有布局逻辑。这个问题包含四种不同的尝试来解决这个问题,每一种都有不同的缺点,因此也有不同的失败点。此外,可以在更下方找到一个小型测试用例。

问题是:我如何正确实现这一目标

  • 在定义我的自定义面板时
  • 内部重用另一个面板的布局逻辑,没有
  • 遇到我试图解决这个问题时描述的问题?

我正在尝试编写自定义 WPF面板。对于这个面板类,我想坚持推荐的开发实践,并保持一个干净的 API 和内部实现。具体来说,这意味着:

  • 我想避免复制和粘贴代码;如果代码的几个部分具有相同的功能,则该代码应该只存在一次并且可以重复使用。
  • 我想应用适当的封装,让外部用户只访问可以安全使用的成员(不破坏任何内部逻辑,或不泄露任何内部实现特定信息)。

就目前而言,我将密切关注现有布局,我想重新使用另一个面板的布局代码(而不是再次编写布局代码,如此处所建议的那样。举个例子,我将DockPanel根据Panel.

为了重用布局逻辑,我打算DockPanel在我的面板中添加一个作为可视子项,然后它将保存和布局我的面板的逻辑子项。

我已经尝试了三种不同的想法来解决这个问题,并且在评论中提出了另一种想法,但到目前为止,它们中的每一个都在不同的点上失败了:


1)在自定义面板的控件模板中引入内部布局面板

这似乎是最优雅的解决方案 - 这样,自定义面板的控制面板可以具有ItemsControlItemsPanel属性使用 a DockPanel,并且其ItemsSource属性绑定到自定义面板的Children属性

不幸的是,Panel它没有继承自Control,因此没有Template属性,也没有对控件模板的功能支持。

另一方面,该Children属性是由 引入的Panel,因此不存在于 中,我觉得打破预期的继承层次并创建一个实际上是 a而不是 aControl的面板可能被认为是 hacky 。ControlPanel


2) 提供我的面板的子列表,它只是内部面板的子列表的包装

这样的类如下所示。我UIElementCollection在面板类中进行了子类化,并从CreateUIElementCollection方法的覆盖版本返回它。(我只复制了这里实际调用的方法;我已经实现了其他方法来抛出 a NotImplementedException,所以我确定没有调用其他可覆盖的成员。)

几乎可以正常工作;布局按DockPanel预期重复使用。唯一的问题是绑定不会在面板中按名称(使用ElementName属性)找到控件。

我试过从LogicalChildren属性返回内部孩子,但这并没有改变任何东西:

在用户Arie的回答中,该类被指出在这方面起着至关重要的作用:子控件的名称由于某种原因没有在相关中注册。这可以通过为每个孩子调用来部分解决,但需要检索正确的实例。此外,我不确定当孩子的名字发生变化时的行为是否与其他面板中的行为相同。NameScopeNameScopeRegisterNameNameScope

相反,设置NameScope内部面板的 似乎是要走的路。我尝试了一个简单的绑定(在TestPanel1构造函数中):

不幸的是,这只是将NameScope内部面板的 设置为null。据我通过Snoop发现,实际NameScope实例仅存储在父窗口的NameScope附加属性中,或者由控件模板定义的封闭可视树的根(或可能由其他关键节点? ),不管是什么类型。当然,一个控件实例在其生命周期中可能会在控件树的不同位置被添加和移除,因此相关的NameScope可能会不时发生变化。这再次要求绑定。

这就是我再次陷入困境的地方,因为不幸的是,无法RelativeSource根据任意条件为绑定定义 a ,例如 *the first遇到的节点具有null分配给NameScope附加属性的非值。

除非关于如何对周围可视树中的更新做出反应的其他问题产生有用的响应,否则是否有更好的方法来检索和/或绑定到NameScope当前与任何给定框架元素相关的元素?


3)使用内部面板,其子列表与外部面板的实例完全相同

与其将子列表保留在内部面板中并将调用转发到外部面板的子列表,不如说是反过来。在这里,只使用了外面板的子列表,而内面板从不创建自己的子列表,而只是使用相同的实例:

在这里,按名称布局和绑定到控件是可行的。但是,这些控件不可单击。

我怀疑我必须以某种方式将呼叫转发到HitTestCore(GeometryHitTestParameters)内部HitTestCore(PointHitTestParameters)面板。但是,在内部面板中,我只能访问InputHitTest,因此我不确定如何安全地处理原始HitTestResult实例而不丢失或忽略原始实现会尊重的任何信息,也不知道如何处理GeometryHitTestParameters,因为InputHitTest只接受简单Point

此外,这些控件也是不可聚焦的,例如按Tab。我不知道如何解决这个问题。

此外,我对这种方式有点谨慎,因为我不确定内部面板和原始子列表之间的内部链接是什么,我通过用自定义对象替换该子列表来破坏该列表。


4)直接从面板类继承

用户Clemens建议直接让我的类继承自DockPanel. 但是,这不是一个好主意有两个原因:

  • 我的面板的当前版本将依赖于DockPanel. 然而,在未来的某个时候,这可能已经不够了,有人确实必须在我的面板中编写自定义布局逻辑。在这种情况下,用自定义布局代码替换内部DockPanel是微不足道的,但从DockPanel我的面板的继承层次结构中删除将意味着重大更改。
  • 如果我的面板继承自DockPanel,则面板的用户可能会破坏其布局代码DockPanel,尤其是LastChildFill. 虽然它只是那个属性,但我想使用一种适用于所有Panel子类型的方法。例如,派生自的自定义面板Grid将公开ColumnDefinitionsRowDefinitions属性,通过该属性,任何自动生成的布局都可以通过自定义面板的公共接口完全销毁。

作为观察所描述问题的测试用例,添加在 XAML 中测试的自定义面板的实例,并在该元素中添加以下内容:

文本块应该位于文本框的左侧,并且应该显示当前在文本框中写入的任何内容。

我希望文本框是可点击的,并且输出视图不会显示任何绑定错误(因此,绑定也应该有效)。


因此,我的问题是:

  • 我的任何一项尝试都可以解决以导致完全正确的解决方案吗?还是有一种完全其他的方式比我试图做的事情更可取?
0 投票
2 回答
328 浏览

gwt - GWT - 在同一视图/面板中带有过滤器的 DataGrid 表

我正在尝试在我的视图上添加一个 DataGrid。我知道 DataGrid 只能留在布局面板中,因为提供了 ProvidesResize 和 RequiresResize 接口。

问题是,我想在 DataGrid 表的顶部添加一个过滤器,并且过滤器不能有固定的高度,它可以更大或更小。

没有 Layout Panel 会接受超过一个要调整大小的孩子,但 LayoutPanel 本身。但是,每一层都需要以百分比设置高度,这也不行。

如果我用 CellTable 更改 DataGrid,然后在 Flow Panel 中添加两者,问题就会解决,但表格必须是可滚动的。

我需要的是 FlowLayoutPanel 但 GWT 中没有这样的面板

我在想唯一的方法是尝试创建一个自定义面板来实现 ProvidesResize 和 RequiresResize 接口。

这是使用 LayoutPanel 的样子:

谁能帮我这个 ?提前谢谢了。