基本上,我想GridSplitter.FixedPanel模擬WinForms.
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 和一些私有欄位,例如。
- 使用這個SO 主題
Behavior中建議的類似(我已經多年沒有使用行為,有一些令人耳目一新的事情要做 - 老實說,我真的希望有一個僅限 XAML 的方法,但如果沒有,我更喜歡后面的代碼我公開新的依賴屬性而不是行為的方式) - 我相信我缺少 WPF 的一項功能來實作這一WPF 方式。幾乎所有時候我都在想“好吧,我想我必須在這個后面撰寫代碼......”,有 WPF 方式,通常更簡單、更安全、易于設計并且更好,性能更明智。這就是我直接詢問的原因,也許會幫助其他人尋找該功能。
編程語言(就此而言): C#
編輯:在 Léo Savador 的回答之后:
請參閱:有一種WPF 方式(玩弄 XAMLColumnDefinition 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,但更難描述。
uj5u.com熱心網友回復:
這是一個簡單的解決方案,我可以根據您的需要向您推薦:
對于您的右列,不要使用動態寬度 (1*),而是使用固定寬度:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="3" />
<ColumnDefinition Width="160" />
</Grid.ColumnDefinitions>
如果您將固定寬度設定為 160:
- 您將獲得相同的初始結果(視窗初始寬度的 1/5)
- 您仍然可以調整網格的大小
- 調整大小時,您的右欄將保持其寬度
而且您還可以使用后面的代碼根據視窗初始寬度在啟動時計算所需的固定寬度,使其更加“動態”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/415524.html
標籤:
上一篇:有沒有辦法添加DOM元素作為谷歌地圖jsapi的標記
下一篇:如何定義物件在畫布中的移動限制?
