簡體   English   中英

當網格(用戶控件/窗口)大小發生變化時,帶有固定面板(網格列)的 GridSplitter

[英]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 調整大小時使一列保持其寬度(例如右側的一列,因為它承載屬性、工具等),因此只調整左列的大小。

我有一些想法:

  1. 只需在 WinForms 中模擬 FixedPanel 的代碼即可:DragStarted、DragCompleted 和一些私有字段,例如。
  2. 使用此SO 主題中建議的Behavior (我已經多年沒有使用行為,有一些令人耳目一新的事情要做 - 老實說,我真的希望有一個僅 XAML 的方法,但如果沒有,我更喜歡代碼在我公開新的依賴屬性而不是行為的方式后面)
  3. 我相信我缺少 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的名稱,而MainGridGrid的名稱。

非常感謝,正在編寫繁重的代碼。 你為我節省了很多時間:D


PS:請不要以為我是 WinForm 的粉絲。 我只是提到 WinForms 來提供所需功能的比較示例,可以使用 CSS 和 JS,但更難描述。

這是一個簡單的解決方案,我可以根據您的需要向您推薦:

對於您的右列,不要使用動態寬度 (1*),而是使用固定寬度:

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="3" />
            <ColumnDefinition Width="160" />
        </Grid.ColumnDefinitions>

如果您將固定寬度設置為 160:

  • 您將獲得相同的初始結果(窗口初始寬度的 1/5)
  • 您仍然可以調整網格的大小
  • 調整大小時,您的右欄將保持其寬度

您還可以根據 window 初始寬度在啟動時使用代碼來計算所需的固定寬度,使其更加“動態”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM