Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
C# 在WPF中如何防止ScrollViewer中的控件扩展_C#_Wpf_Datagrid_Scrollviewer - Fatal编程技术网

C# 在WPF中如何防止ScrollViewer中的控件扩展

C# 在WPF中如何防止ScrollViewer中的控件扩展,c#,wpf,datagrid,scrollviewer,C#,Wpf,Datagrid,Scrollviewer,我正试图在WPF中实现一些听起来很简单的东西,但就是绕不开它。 我有一个ScrollViewer,它包含两个GroupBox。第一个将其高度设置为固定值,第二个将获取窗口的剩余部分,但具有最小高度。每个GroupBox都包含一个数据网格 我想做的是: 第二个groupbox的大小应与窗口左侧的大小一致,其中的DataGrid的大小应与组框的大小一致,如果行不能全部显示,则应有自己的滚动条。如果我将窗口的大小调整为小于GroupBox1.Height+GroupBox2.MinHeight,则窗口

我正试图在WPF中实现一些听起来很简单的东西,但就是绕不开它。 我有一个ScrollViewer,它包含两个GroupBox。第一个将其高度设置为固定值,第二个将获取窗口的剩余部分,但具有最小高度。每个GroupBox都包含一个数据网格

我想做的是: 第二个groupbox的大小应与窗口左侧的大小一致,其中的DataGrid的大小应与组框的大小一致,如果行不能全部显示,则应有自己的滚动条。如果我将窗口的大小调整为小于GroupBox1.Height+GroupBox2.MinHeight,则窗口中应显示一个滚动条

我现在得到的行为是,第二个groupbox高度中的DataGrid随着行数的增加而增加,从而扩展groupbox并显示Scrollviewer的滚动条

我设计了一个演示应用程序来展示这种行为

WPF:


C#

名称空间WpfApp1
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=this;
颜色=新列表();
对于(int i=1;i<51;i++)
{
字节b=(字节)(i*5);
添加(Color.FromRgb(b,b,b));
}
}
私有列表颜色;
公共列表颜色
{
得到
{
返回颜色;
}
设置
{
_颜色=价值;
}
}
}
}
我得到的是:

我想要的是(很抱歉照片处理技巧不好):

除非,如前所述,我将窗口的大小调整为小于group1的固定大小和group2的最小大小之和,在这种情况下,我需要窗口的滚动条

在这种情况下,我希望它看起来像这样:(再次是一个模型,而不是一个实际的屏幕截图)

请注意,这个示例非常简单,但我尝试使用的窗口要复杂得多,而且与本示例相比,使用垂直滚动条更有意义


谢谢

我不知道这是否是解决您的问题的最简单的方法,但您可以按照以下思路做一些事情:

<Window x:Class="WpfApp1.MainWindow"
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:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow"
Height="400"
Width="500">
<Window.Resources>
    <local:HeightConverter x:Key="HeightConverter"/>
</Window.Resources>
<Grid>
    <ScrollViewer VerticalScrollBarVisibility="Auto" x:Name="MainView">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="150" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <GroupBox Header="test1"
                  Grid.Row="0">
                <DataGrid ItemsSource="{Binding Colors}">
                </DataGrid>
            </GroupBox>
            <GroupBox Header="test2"
                  Grid.Row="1"
                  x:Name="grpBox2"
                  MinHeight="50">
                <GroupBox.Height>
                    <MultiBinding Converter="{StaticResource HeightConverter}" ConverterParameter="150">
                        <Binding Path="ActualHeight" ElementName="MainView" />
                        <Binding Path="MinHeight" ElementName="grpBox2" />
                    </MultiBinding>
                </GroupBox.Height>
                <DataGrid ItemsSource="{Binding Colors}">
                </DataGrid>
            </GroupBox>
        </Grid>

    </ScrollViewer>
</Grid>

对于转换器,如下所示:

public class HeightConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
        if (values == null || parameter == null || values[0] == null || values[1] == null)
        {
            return null;
        }

        var currentWindowHeight = double.Parse(values[0].ToString());
        var currentMinHeight = double.Parse(values[1].ToString());

        var currentTopWindowHeight = double.Parse(parameter.ToString());

        var newHeight = currentWindowHeight - currentTopWindowHeight;

        if (newHeight < currentMinHeight)
            newHeight = currentMinHeight;

        return newHeight;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类高度转换器:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
如果(值==null | |参数==null | |值[0]==null | |值[1]==null)
{
返回null;
}
var currentWindowHeight=double.Parse(值[0].ToString());
var currentMinHeight=double.Parse(值[1].ToString());
var currentTopWindowHeight=double.Parse(parameter.ToString());
var newHeight=currentWindowHeight-currentTopWindowHeight;
如果(新高度<当前最小高度)
新高度=当前最小高度;
返回新高度;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}

只需将第二个
GroupBox
MaxHeight
属性绑定到
ScrollViewer
容器的
实际高度
减去第一个
GroupBox

完整示例(不包括与您相同的代码):


公共类减法转换器:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
double[]doubles=values.Cast().ToArray();
双倍结果=双倍[0];
for(int i=1;i
为ScrollViewer元素指定一个固定的高度?@mm8这样做会使它对可调整大小的窗口无效。将较小的值设置为ScrollViewer高度将使其始终可见,并限制组占用的空间。拥有一个大的值最终会显示出完全相同的问题。编辑:我试过了,只是为了确定问题是否存在,即使是对于一个小的ScrollViewer。第二组扩展到网格的内容,我只有更少的空间滚动,窗口的大小也变得无用。我不理解你的问题。第二张图片上没有ScrollViewer。那么您希望这个ScrollViewer什么时候显示呢?如前所述,只有当我调整窗口大小使其太小而无法显示Group1的高度(固定大小)和Group2的最小高度时,ScrollViewer才会显示。然后您应该将ScrollViewer的高度或最小高度设置为Group1.Height+Group2.Height。非常好!测试
<Window x:Class="WpfApp1.MainWindow"
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:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow"
Height="400"
Width="500">
<Window.Resources>
    <local:HeightConverter x:Key="HeightConverter"/>
</Window.Resources>
<Grid>
    <ScrollViewer VerticalScrollBarVisibility="Auto" x:Name="MainView">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="150" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <GroupBox Header="test1"
                  Grid.Row="0">
                <DataGrid ItemsSource="{Binding Colors}">
                </DataGrid>
            </GroupBox>
            <GroupBox Header="test2"
                  Grid.Row="1"
                  x:Name="grpBox2"
                  MinHeight="50">
                <GroupBox.Height>
                    <MultiBinding Converter="{StaticResource HeightConverter}" ConverterParameter="150">
                        <Binding Path="ActualHeight" ElementName="MainView" />
                        <Binding Path="MinHeight" ElementName="grpBox2" />
                    </MultiBinding>
                </GroupBox.Height>
                <DataGrid ItemsSource="{Binding Colors}">
                </DataGrid>
            </GroupBox>
        </Grid>

    </ScrollViewer>
</Grid>
public class HeightConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
        if (values == null || parameter == null || values[0] == null || values[1] == null)
        {
            return null;
        }

        var currentWindowHeight = double.Parse(values[0].ToString());
        var currentMinHeight = double.Parse(values[1].ToString());

        var currentTopWindowHeight = double.Parse(parameter.ToString());

        var newHeight = currentWindowHeight - currentTopWindowHeight;

        if (newHeight < currentMinHeight)
            newHeight = currentMinHeight;

        return newHeight;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
<Window.Resources>
    <wpfApp1:SubtractConverter x:Key="SubtractConverter"/>
</Window.Resources>

<Grid Name="Root">
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="150" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <GroupBox
                Name="Test1"
                Header="test1"
                Grid.Row="0">

                <DataGrid ItemsSource="{Binding Colors}"/>
            </GroupBox>
            <GroupBox
                Header="test2"
                Grid.Row="1"
                MinHeight="250">
                <DataGrid ItemsSource="{Binding Colors}"/>

                <GroupBox.MaxHeight>
                    <MultiBinding Converter="{StaticResource SubtractConverter}">
                        <Binding Path="ActualHeight" ElementName="Root"/>
                        <Binding Path="ActualHeight" ElementName="Test1"/>
                    </MultiBinding>
                </GroupBox.MaxHeight>
            </GroupBox>
        </Grid>
    </ScrollViewer>
</Grid>
public class SubtractConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        double[] doubles = values.Cast<double>().ToArray();

        double result = doubles[0];

        for (int i = 1; i < doubles.Length; i++)
        {
            result -= doubles[i];
        }

        return result;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}