كيف يمكنني الحفاظ على WPF GridSplitter من تغيير حجم بلدي الشبكة؟

StackOverflow https://stackoverflow.com/questions/279557

  •  07-07-2019
  •  | 
  •  

سؤال

وWPF GridSplitter يجعل بلدي شبكة أوسع من نافذتي!

ولقد حصلت على الشبكة WPF مع GridSplitter. إذا كنت تغيير حجم الأعمدة بلدي، بعد ذلك يمكنني أن أجعل شبكة أوسع من نافذتي وغير قابلة للعرض.

ويبدأ مثل هذا:

WPF الشبكة http://img201.imageshack.us/img201/9505/onehg6 .jpg و

ولكن بعد توسيع العمود الأيسر، ويمكنني أن لم تعد ترى في العمود الأيمن (الأخضر):

WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6 .jpg و

وماذا أفعل الخطأ؟ كيف يمكنني الحفاظ على GridSplitter من تغيير حجم بلدي الشبكة؟


تحديث:

وأنا لا تزال تكافح مع هذا. لقد حاولت الآن شبكات تعشش داخل الشبكات. لكن ذلك لم يساعد. وهنا قال لي ColumnDefinitions XAML، RowDefinitions، وGridSplitters ...

<Window ... >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="150" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" MinWidth="400" />
        </Grid.ColumnDefinitions>
        <GridSplitter 
            ResizeDirection="Columns"
            ResizeBehavior="BasedOnAlignment"
            Grid.Column="1"
            HorizontalAlignment="Center"
            VerticalAlignment="Stretch"
            Width="2"
            Margin="0,5,0,5"
            Panel.ZIndex="1"/>
        <Grid Grid.Column="0">
            ...
        </Grid>
        <Grid Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" MinWidth="150" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" MinWidth="200" />
            </Grid.ColumnDefinitions>
            <GridSplitter 
                ResizeDirection="Columns"
                ResizeBehavior="PreviousAndNext"
                Grid.Column="1"
                HorizontalAlignment="Center"
                VerticalAlignment="Stretch"
                Width="2"
                Margin="0,5,0,5"
                Panel.ZIndex="1"/>
            <Grid Grid.Column="0">
                ...
            </Grid>
            <Grid Grid.Column="2">
                ...
            </Grid>
        </Grid>
    </Grid>
</Window>

تحديث:

وأعتقد أن المشكلة هي مع التحكم WebBrowser. انظر السؤال الجديد:

WPF GridSplitter لا يعمل مع التحكم WebBrowser؟

هل كانت مفيدة؟

المحلول

إذا يتم تغيير حجم نافذة بحيث العرض في أقل من مجموع MinWidths الأعمدة الخاصة بك، سترى قطع الأعمدة قبالة، ولكن على خلاف ذلك لا يمكن استنساخها مشكلتك:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="150" Width="*"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition MinWidth="400" Width="*"/>
        </Grid.ColumnDefinitions>
        <GridSplitter
            Width="2"
            Grid.Column="1"
            HorizontalAlignment="Center"
            Margin="0,5,0,5"
            Panel.ZIndex="1"
            VerticalAlignment="Stretch"
            ResizeBehavior="BasedOnAlignment"
            ResizeDirection="Columns"/>
        <Grid Grid.Column="0">
            <Border Background="Red" Margin="5"/>
        </Grid>
        <Grid Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="150" Width="*"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition MinWidth="200" Width="*"/>
            </Grid.ColumnDefinitions>
            <GridSplitter
                Width="2"
                Grid.Column="1"
                HorizontalAlignment="Center"
                Margin="0,5,0,5"
                Panel.ZIndex="1"
                VerticalAlignment="Stretch"
                ResizeBehavior="PreviousAndNext"
                ResizeDirection="Columns"/>
            <Grid Grid.Column="0">
                <Border Background="Green" Margin="5"/>
            </Grid>
            <Grid Grid.Column="2">
                <Border Background="Blue" Margin="5"/>
            </Grid>
        </Grid>
    </Grid>
</Window>

والتوسع في العمود الأحمر، فإنه سيتم توسيع فقط حتى يصل العمود الأيمن MinWidth البالغ 400، فإنه لن التمهيد تشغيله الصفحة.

فمن الممكن أنك إعداد خصائص أخرى من النافذة أو الشبكة الأبعد من شأنه أن يسبب هذا السلوك ...

نصائح أخرى

وحاول تغيير العرض الخاص بك إلى نجم الأحجام. سيؤدي هذا الخائن لتغيير حجم الأعمدة فقط بين الذي يجلس، لذلك لست متأكدا إذا كان هذا هو السلوك المطلوب. ومع ذلك، مع أحجام النجوم، والمحتوى لن تنمو خارج حدود النافذة.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" MinWidth="100" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" MinWidth="50" />
        <ColumnDefinition Width="2*" MinWidth="100" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="3*" MinWidth="150" />
    </Grid.ColumnDefinitions>
    <GridSplitter 
        ResizeDirection="Columns"
        Grid.Column="1"
        Grid.RowSpan="8"
        HorizontalAlignment="Center"
        VerticalAlignment="Stretch"
        Width="2"
        Margin="0,5,0,5"
        Panel.ZIndex="1"/>
    ...
</Grid>

وكان يعمل للي دون أي تعليمات برمجية إضافية عندما لا يكون هناك أعمدة مع عرض السيارات بين الخطان، أي بمعنى:.

<Grid >
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="20*" MinWidth="50" MaxWidth="500" />
    <ColumnDefinition Width="Auto"/> <!-- Remove such columns /-->
    <ColumnDefinition Width="100*" MinWidth="850"/>
    <ColumnDefinition Width="30*" MinWidth="50" MaxWidth="800" />
</Grid.ColumnDefinitions>
...
<GridSplitter HorizontalAlignment="Right" Width="3"/>
...
<GridSplitter Grid.Column="3" HorizontalAlignment="Left" Width="3" />
<!-- Assign Grid.Column to 2 if you remove the auto width column /-->
...
</Grid>

وإلا فإن الشبكة سيكون يمكن تغيير حجم.

والتقاط الحدث DragDelta طريقة أخرى للقيام بذلك:

private void VerticalGridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
    if (GridName.ColumnDefinitions[2].Width.Value < 400)
    {
        GridName.ColumnDefinitions[2].Width = new GridLength(400);
    }
}

ولكن يجب استخدام MinWidth على * ColumnDefinition تعمل على ما يرام. لاحظ أن ColumnDefinition مع MinWidth يجب أن تكون على أعلى مستوى. هو لا يعمل إذا لم متداخلة في بعض الشبكة داخل العمود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top