Tag: 布局

Control.GetPreferredSize方法的目的是什么?

我正在努力实现一个用户控件,它根据某些属性改变其大小。 据我所知,winforms布局引擎会在执行布局时询问每个子控件的首选大小,并告知它们可以承受的最大大小。 这是msdn中GetPreferredSize的描述: Control.GetPreferredSize(Size proposedSize) 检索可以安装控件的矩形区域的大小。 我对以下内容感到困惑: 您可以返回大于proposedSize参数中指示的约束的大小,但随着约束减少,proposedSize应该减少。 这是什么意思? 如果我返回的尺寸大于建议值,会发生什么? 有人可以解释一下这是如何工作的?

如何为新的Panel Class重用现有的Layouting Code?

tl; dr:我想重用自定义WPF面板类的预定义WPF面板的现有布局逻辑。 这个问题包含四种不同的尝试来解决这个问题,每个尝试都有不同的缺点,因而有不同的失败点。 此外,还可以找到一个小型测试用例。 问题是:我如何正确实现这一目标 定义我的自定义面板 内部重用另一个面板的布局逻辑,没有 遇到我试图解决这个问题所描述的问题? 我正在尝试编写自定义WPF 面板 。 对于这个面板类,我想坚持推荐的开发实践并维护一个干净的API和内部实现。 具体地说,这意味着: 我想避免复制和粘贴代码; 如果代码的几个部分具有相同的function,则代码应该只存在一次并重复使用。 我想应用适当的封装,让外部用户只能访问可以安全使用的成员(不破坏任何内部逻辑,或者不泄露任何内部实现特定的信息)。 至于目前,我将密切关注现有的布局,我想重新使用另一个面板的布局代码(而不是再次编写布局代码,如此处所示 )。 为了举个例子,我将基于DockPanel解释,虽然我想知道如何基于任何类型的Panel 。 为了重用布局逻辑,我打算在我的面板中添加一个DockPanel作为可视子项,然后它将保持并布局我的面板的逻辑子项。 我已经尝试了三种不同的想法如何解决这个问题,并在评论中提出了另一个想法,但到目前为止,每个想法都在不同的点上失败了: 1)在自定义面板的控件模板中引入内部布局面板 这似乎是最优雅的解决方案 – 这样,自定义面板的控制面板可以使用ItemsControl其ItemsPanel属性使用DockPanel ,其ItemsSource属性绑定到自定义面板的Children属性 。 不幸的是, Panel不从Controlinheritance,因此没有Template属性 ,也没有控件模板的function支持。 另一方面, Children属性是由Panel引入的,因此不会出现在Control ,我觉得打破预期的inheritance层次结构并创建一个实际上是Control的Panel ,而不是Panel ,可能会被认为是hacky 。 2)提供我的面板的子列表,该列表仅仅是内部面板的子列表的包装器 这样的课程如下所示。 我在我的面板类中已经子类化了UIElementCollection ,并从一个重写版本的CreateUIElementCollection方法返回它。 (我只复制了这里实际调用的方法;我已经实现了其他方法来抛出NotImplementedException ,所以我确信没有调用其他可重写的成员。) using System; using System.Windows; using System.Windows.Controls; namespace WrappedPanelTest { public class TestPanel1 […]

谁知道winforms的灵活Metro ui?

他们中的很多人都有硬编码的方形小块和2个方块大小的瓷砖。 我正在寻找足够灵活的东西,至少尺寸比可以调整到更平坦。 Telerik有一个灵活的方法(你可以为一个瓷砖选择任何行和列跨度),但它们的实现要么是可笑的原始还是太新,特别是拖放部分。 Devexpress具有很好的拖放function,但卡在1×1和1×2尺寸的瓷砖上。

用于ScrollViewer中图像的动态网格的布局

我有一个包含图像Grid的ScrollViewer 。 我不确定使用网格是否是正确的选择。 这是我希望它看起来像的模型图像: 红色框表示ScrollViewer 。 在它内部,是某种类型的布局容器(目前为Grid ),它有两行图像(绿色方块),但动态数量的列可以在运行时更改,可以滚动到。 另一个条件是我想要调整它们的大小,以便始终可以看到6个图像(并且只有6个!)。 所以在XAML中: 然后使用C#我想我需要动态添加列。 然后听取scrollViewer1的SizeChanged事件,我需要动态计算行和列的大小,以便总是在视图中看到3个图像。 例如: ColumnDefinition gridColN = new ColumnDefinition(); grid1.ColumnDefinitions.Add(gridColN); 问题#1:动态添加更多列会使网格单元变得越来越小,并且永远不会在ScrollViewer直到有10列以上。 预期结果:最终结果应该是水平的图像流,一次可见6,当调整外部容器或窗口大小时将resize。 我试图动态调整其宽度,但将它们设置为容器宽度的1/3不起作用。 问题:这是正确的方法吗? 我应该在ScrollViewer使用Grid吗? 我是否必须手动计算尺寸或者是否有办法让它们装满容器?

如何按比例调整WPF Listview的大小?

调整Listview控件的大小有点问题。 我打算根据窗口的实际大小按比例resize。 对于Listview的初始大小,它是300 X 600(宽X高),以像素为单位。 我还将其maxHeight设置为750,但其宽度保持不变,即300。 此外,在Wondow的属性中,我已将SizeToContent属性更改为WidthAndHeight ,因为有些线程建议您在调整窗口大小后让系统决定控件的正确大小。 但是,它尚未奏效。 所以我来这里寻求帮助。 谢谢。 无论如何我们可以在WPF中设置宽度和高度的百分比值吗? 如果我被允许使用百分比,例如身高= 80%,那就容易多了。 编辑: 为了更清楚,这里是xaml中的通用代码结构 如您所见,我目前正在使用2个堆栈面板并将它们放在不同的行中。 但即使我改变了,Listview仍然无法按比例resize。

在ListBox ItemTemplate中的Togglebutton中的Textblock内进行Textwrapping

我正在尝试为列表框项目实现ToggleButton控件模板。 这将在用户可以单击列表框项目以显示某个function的应用程序中使用。 列表框项模板定义如下: 并且列表框定义为 这里我有两个文本块,一个绑定到ExampleDisplayName,另一个绑定到ExampleDescription。 我想要实现的效果是让第二个文本块(描述)环绕,受可用空间的约束。 这就是我现在得到的: 我想要的是显示示例描述的第二行,根据列表框的大小进行换行。 当应用程序启动时,列表框应自动resize到第一行+边距。 有什么建议?

对齐TextBox和Label文本

我正在设计一个用户界面,我发现自己的头痒:如何对齐TextBox文本和标签文本,它们是并排的。 在设计模式下,它很简单,你用鼠标移动一个,出现紫色线条瞧! 对齐是好的,但我的代码是生成的,所以我如何调整其内容? 谢谢 ! 编辑 :布局是我无法使用的东西(我没有制定规则,我老板做..)

如何修复嵌套的winform控件闪烁问题

我目前正在开发一个程序,该程序使用相当复杂的嵌套winform控件结构,当用户进行某些选择时,这些控件会动态更改。 有关控件的具体布局的详细信息,请参阅此问题。 在进行选择时,会对由用户控件控制的基础模型进行大量更新。 然后,这导致所显示的控件的大小/位置/可见性的一系列相应变化。 所有这些变化都会导致屏幕上控件的剧烈闪烁。 我需要以某种方式修复此问题,以便每次用户进行选择时,屏幕基本上都会冻结,直到所有控件更新完成。 我试图在许多不同的地方和方式使用Control.SuspendLayout / Control.ResumeLayout方法,我无法消除疯狂的闪烁。 我认为在更改期间暂停根控件上的布局可以解决问题,但看起来这个SuspendLayout在更改子控件时没有帮助。 我是否需要使用其他方法而不是SuspendLayout? 有没有办法我可以调试SuspendLayout,看看为什么它似乎没有级联到所有的子控件?

将WPF ContextMenu放在第二个屏幕上

我目前正在尝试解决以下问题: 我没有父窗口,我只是右键单击第二个屏幕,打开一个WPF ContextMenu(来自原生C ++母版应用程序),它实际上没有出现在第二个屏幕上,而是出现在第一个屏幕上。 我尝试使用鼠标坐标。 不起作用,因为ContextMenu将保留在第一个屏幕上。 在第二个屏幕上放置一个不可见的辅助窗口,将其设置为父级并在相对于第二个屏幕左上角的坐标处打开ContextMenu工作正常。 但我不想使用辅助窗口。 现在:如何在没有父窗口的情况下将ContextMenu放在第二个屏幕上。 有没有办法告诉菜单使用什么屏幕? 也许我可以在ContextMenu的“CustomPopupPlacementCallback”中使用一些参数? 任何帮助将不胜感激:-D 干杯!

影响测量或影响范围

我正在创建自定义控件,如果其中一个Dependency属性更改,我需要更新布局。 我可以使用FrameworkMetadataProperty.AffectsMeasure或FrameworkMetadataProperty.AffectsArrange 。 问题1 – 我很困惑使用哪一个。 此外,我还可以使用UpdateLayout和InvalidateVisual方法来更新UI。 Q.2 – 所有这4件事看起来都很相似,并且在使用哪一件时感到困惑?