在WrapPanel内自动调整大小?

时间:2014-03-05 22:50:44

标签: wpf xaml

需要xaml布局的帮助。

我有一个里面有两个元素的Wrapanel。左边的MainGrid需要固定在900像素。第二个是AuxillaryDataScrollViewer,如果WrapPanel包装它,我希望至少为650,最大为100%。这可能吗?

这是我到目前为止所得到的:

<Window x:Class="scratch.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="768" Width="1024">
    <Grid>
        <ScrollViewer>
            <WrapPanel>
                <Grid Width="900" Height="800" Background="Bisque"></Grid>
                <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Hidden" Width="650">
                    <Grid Width="1500" Height="700" Background="Tomato"></Grid>
                </ScrollViewer>
            </WrapPanel>
        </ScrollViewer>
    </Grid>   
</Window>

谢谢!

修改添加更多详细信息:

客户端希望进行数据输入并在右侧面板中实时查看计算结果,但是他实验室中的某些计算机只能容纳1280像素的宽度,所以在这些机器上他希望将结果包装到下面数据录入表格。

1 个答案:

答案 0 :(得分:3)

由于需求定义得很好,您只需添加SizeChanged处理程序,并根据容器的宽度手动设置第二个元素的宽度。如果容器小于900 + 650,则将第二个元素拉伸至容器的100%。

public MainWindow()
{
    SizeChanged += MainWindow_SizeChanged;
}

void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
    double firstElementWidth = MainGrid.Width;                          // 900
    double secondElementMinWidth = AuxillaryDataScrollViewer.MinWidth;  // 650 

    double secondElementWidth;

    // if wrapped, stretch to the container
    if (e.NewSize.Width < firstElementWidth + secondElementMinWidth)
        secondElementWidth = e.NewSize.Width;
    // otherwise (not wrapped), fill the remainder of the first row
    else
        secondElementWidth = e.NewSize.Width - firstElementWidth;
}

显然这是快速而肮脏的。如果你需要更强大的东西,那么我建议写一个符合你需要的约定的custom panel。 WrapPanel无法将元素拉伸到整体宽度,但没有理由不能设计出能够实现的面板。