Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 有没有办法让GridSplitter不将元素推出窗口?_Wpf_Grid_Gridsplitter - Fatal编程技术网

Wpf 有没有办法让GridSplitter不将元素推出窗口?

Wpf 有没有办法让GridSplitter不将元素推出窗口?,wpf,grid,gridsplitter,Wpf,Grid,Gridsplitter,使用下面的XAML,当我向左拖动GridSplitter时,它会将元素推出窗口。 如何将所有元素保持在窗框内 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/> </

使用下面的XAML,当我向左拖动GridSplitter时,它会将元素推出窗口。 如何将所有元素保持在窗框内

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="auto"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0" Content="0" />
    <Button Grid.Column="1" Content="1" />
    <Button Grid.Column="2" Content="2" />
    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Left" />
</Grid>


谢谢

我知道解决您问题的唯一方法是将gridsplitter左右的列的宽度属性设置为
width=“*”
,并将gridsplitter自己的列的水平对齐设置为
HorizontalAlignment=“Stretch”
。然后,您的代码将以如下方式结束

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="auto"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0" Content="0" />
    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch"/>
    <Button Grid.Column="2" Content="1" />
    <Button Grid.Column="3" Content="2" />
</Grid>  

我也遇到了同样的问题,并提出了这个解决方案。基本上,这个想法是在网格/列发生更改时动态更改相应列的MaxWidth。我在这里展示了两列,但我已经成功地在三列中使用了这种方法

使用这种方法,如果向下调整窗口的大小使其不再适合网格的内容,网格将停止更改大小,因此ResizeGrid_SizeChanged事件将停止调用。要解决此问题,还可以侦听窗口(或用户控件)大小更改事件。您可能还需要适当地绑定网格的MaxWidth,或者如果网格填充窗口/用户控件,则直接使用控件大小。我在这里展示了如何通过XAML绑定MaxWidth属性。如果您不想这样做,可以在后面的窗口代码中将“ResizeGrid.MaxWidth”替换为“ActualWidth”,并删除“ResizeGrid”对象上的“MaxWidth”绑定

XAML:


请尝试为
网格
列定义
设置
MinWidth
。感谢您的回复。试过了,运气不好。我还尝试了*大小的列,但没有结果。当我将窗口更改为其内容的大小时,控件仍保留在窗口框架中,但窗口大小会更改。理想情况下,我希望实现窗口大小固定,所有其他大小自动调整/按比例调整。
<Window x:Class="App.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Default="clr-namespace:App" 
        mc:Ignorable="d"
        SizeChanged="Window_SizeChanged"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid x:Name="ResizeGrid" SizeChanged="ResizeGrid_SizeChanged" 
              MaxWidth="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Default:Window1}}}">

            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="C0" Width="150" MinWidth="50" />
                <ColumnDefinition Width="5" />
                <ColumnDefinition x:Name="C2" Width="*" MinWidth="50" />
            </Grid.ColumnDefinitions>

            <Grid Grid.Column="0" Background="Green">
                <Label Content="Left" />
                <Label Content="Right" HorizontalAlignment="Right" />
            </Grid>

            <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" DragCompleted="GridSplitter_DragCompleted" />

            <Grid Grid.Column="2" Background="Red">
                <Label Content="Left" />
                <Label Content="Right" HorizontalAlignment="Right" />
            </Grid>
        </Grid>
    </Grid>
</Window>
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    UpdateGridSplitterWidths();
}

private void ResizeGrid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    UpdateGridSplitterWidths();
}

private void GridSplitter_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
    UpdateGridSplitterWidths();
}

private void UpdateGridSplitterWidths()
{
    C0.MaxWidth = Math.Min(ResizeGrid.ActualWidth, ResizeGrid.MaxWidth) - (C2.MinWidth + 5);
}