[英]Grid with GridSplitter is resized incorrectly when resizing the main window
[英]GridSplitter with a fixed panel (grid column) when grid (usercontrol/window) size changes
基本上,我想模擬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 的(未最大化)window 的大小,現在拆分器(自動)兩側的兩個網格列都調整了大小。 開始時的空間分配需要 4/5 和 1/5 的列寬比,但實際的空間分配取決於顯示的數據,因此需要使用網格拆分器。
如何在 window 調整大小時使一列保持其寬度(例如右側的一列,因為它承載屬性、工具等),因此只調整左列的大小。
我有一些想法:
Behavior
(我已經多年沒有使用行為,有一些令人耳目一新的事情要做 - 老實說,我真的希望有一個僅 XAML 的方法,但如果沒有,我更喜歡代碼在我公開新的依賴屬性而不是行為的方式后面) 編程語言(就此而言): 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,但更難描述。
這是一個簡單的解決方案,我可以根據您的需要向您推薦:
對於您的右列,不要使用動態寬度 (1*),而是使用固定寬度:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="3" />
<ColumnDefinition Width="160" />
</Grid.ColumnDefinitions>
如果您將固定寬度設置為 160:
您還可以根據 window 初始寬度在啟動時使用代碼來計算所需的固定寬度,使其更加“動態”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.