【发布时间】:2022-01-19 19:34:03
【问题描述】:
基本上,我想模仿WinForms 中的GridSplitter.FixedPanel 功能。
XAML:
<UserControl ...>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*" />
<ColumnDefinition Width="3" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" />
<GridSplitter
Grid.Column="1" Width="3" VerticalAlignment="Stretch"
Background="Transparent"
ResizeDirection="Columns" ResizeBehavior="PreviousAndNext" />
<ListBox Grid.Column="2" />
</Grid>
</UserControl>
这很好用,并相应地调整每一面的大小。但是假设我们调整包含此 UserControl 的(未最大化)窗口的大小,现在拆分器(自动)每一侧的两个网格列都调整大小。开始时的空间分配需要 4/5 和 1/5 的列宽比,但实际的空间分配取决于显示的数据,因此需要网格拆分器。
如何在调整窗口大小时使一列保持其宽度(例如右侧的一列,因为它承载属性、工具等),因此只调整左列的大小。
我有一些的想法:
- 只需在 WinForms 中模拟 FixedPanel 的代码:DragStarted、DragCompleted 和一些私有字段,例如。
- 使用
Behavior,就像在这个SO topic 中建议的那样(我已经很多年没有使用行为了,有一些令人耳目一新的事情要做 - 老实说,我真的希望有一个仅限 XAML 的方法,但如果没有' t,我更喜欢公开新依赖属性而不是行为的代码隐藏方式) - 我相信我缺少 WPF 的一项功能来实现此WPF 方式。几乎所有时候我都在想“好吧,我想我必须在后面编写代码...”,有 WPF 方式,通常更简单、更安全、易于设计并且更好,性能明智。这就是我直接询问的原因,也许会帮助其他人寻找该功能。
编程语言(就此而言):C#
编辑:在 Léo Savador 的回答之后:
请参阅:有一种 WPF 方式(玩弄 XAML ColumnDefinition Width 属性)和少量代码:
bool p_layoutInitialized = false;
void UserControl_SizeChanged(object sender, SizeChangedEventArgs e) {
if (e.NewSize.Width > 1) { // optional : && e.NewSize.Height > 1
if (!p_layoutInitialized) {
RightColumn.Width = new GridLength(MainGrid.ActualWidth / 5);
p_layoutInitialized = true;
}
}
}
其中RightColumn 是右侧ColumnDefinition 的名称,MainGrid 是Grid 的名称。
非常感谢,正在编写繁重的代码背后。你为我节省了很多时间:D
PS : 请不要以为我是 WinForm 粉丝。我只是提到 WinForms 来提供所需功能的比较示例,可以使用 CSS 和 JS,但更难描述。
【问题讨论】:
标签: c# wpf xaml resize gridsplitter