Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 根据子对象的数量调整统一网格_C#_Wpf_Uniformgrid - Fatal编程技术网

C# 根据子对象的数量调整统一网格

C# 根据子对象的数量调整统一网格,c#,wpf,uniformgrid,C#,Wpf,Uniformgrid,我想在wpf中创建一个uniformGrid 当我有1个孩子时,我希望它填充网格,2个孩子我希望有2列,当我有3或4个孩子时,我希望有2行和2列 因此,我制作了一个转换器,用于检查网格中有多少子元素,并根据这些子元素确定行/列的数量: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Data; using System.Window

我想在wpf中创建一个uniformGrid

当我有1个孩子时,我希望它填充网格,2个孩子我希望有2列,当我有3或4个孩子时,我希望有2行和2列

因此,我制作了一个转换器,用于检查网格中有多少子元素,并根据这些子元素确定行/列的数量:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Controls;
using System.Windows;
using System.Globalization;

namespace UserControlSolution.Converter
{
    [ValueConversion(typeof(int), typeof(int))]
    public class CountToDimensionConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int itemsCount = (int)value;
            int dimensionLength = 1;
            if (itemsCount > 0)
            {   
                if (string.Equals((string)parameter, "Rows", StringComparison.OrdinalIgnoreCase))
                {
                    switch(itemsCount)
                    {
                        case 1: 
                        case 2: dimensionLength = 1;
                            break;
                        case 3: 
                        case 4: dimensionLength = 2;
                            break;
                    }
                }

                if (string.Equals((string)parameter, "Columns", StringComparison.OrdinalIgnoreCase))
                {
                    switch(itemsCount)
                    {
                        case 1: dimensionLength = 1;
                            break;
                        case 2: 
                        case 3: 
                        case 4: dimensionLength = 2;
                            break;
                    }
                }
            }

            return dimensionLength;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}
这是我的xaml:

<customGridView:MyUniformGrid x:Name="AlarmButtonGrid" Margin="0,10" Grid.Row="2" Width="{Binding ActualWidth, ElementName=AlarmPictureBox}"
        Rows="{Binding RelativeSource={RelativeSource Self}, Path=Children.Count, Converter={StaticResource CountToDimensionConverter}, ConverterParameter=Rows}" 
        Columns="{Binding RelativeSource={RelativeSource Self}, Path=Children.Count, Converter={StaticResource CountToDimensionConverter}, ConverterParameter=Columns}"> 

       <Button x:Name="Button1" Content="Sluit" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5" />
       <Button x:Name="Button2" Content="Verbergen" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
       <Button x:Name="Button3" Visibility="Collapsed" Content="Extra rij" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
       <Button x:Name="Button4" Visibility="Collapsed" Content="Extra rij" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
</customGridView:MyUniformGrid>

我在这篇文章中发现,我必须制作一个定制的UniformGrid,以便网格的Children.count实际工作,所以我做到了

这段代码可以正常工作,但我还有一个问题

这些按钮可以动态显示或折叠,当按钮折叠时,我不希望它们与行数有关。 当按钮3和4折叠时,我不想要第二排


你知道如何做到这一点吗

在您的
MyUniformGrid
类中,只需添加一个新属性:

public int VisibleCount
{
    get { return Children.OfType<UIElement>().Count(c => c.Visibility == 
              Visibility.Visible); }
}
public int VisibleCount
{
获取{return Children.OfType().Count(c=>c.Visibility==
可见性。可见);}
}
。。。并与之相联系:

<customGridView:MyUniformGrid x:Name="AlarmButtonGrid" Margin="0,10" Grid.Row="2" 
    Width="{Binding ActualWidth, ElementName=AlarmPictureBox}" Rows="{Binding 
    RelativeSource={RelativeSource Self}, Path=VisibleCount, Converter={
    StaticResource CountToDimensionConverter}, ConverterParameter=Rows}" Columns="{
    Binding RelativeSource={RelativeSource Self}, Path=VisibleCount, Converter={
    StaticResource CountToDimensionConverter}, ConverterParameter=Columns}">                    
    <Button x:Name="Button1" Content="Sluit" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5" />
    <Button x:Name="Button2" Content="Verbergen" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
    <Button x:Name="Button3" Visibility="Collapsed" Content="Extra rij" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
    <Button x:Name="Button4" Visibility="Collapsed" Content="Extra rij" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
</customGridView:MyUniformGrid>


需要注意的唯一一点是,每当您从
网格中添加或删除项时,您可能需要调用
INotifyPropertyChanged.PropertyChanged
事件。子项
集合。。。或者,您可以将其实现为一个
dependencProperty

MyUniformGrid
类中,只需添加一个新属性:

public int VisibleCount
{
    get { return Children.OfType<UIElement>().Count(c => c.Visibility == 
              Visibility.Visible); }
}
public int VisibleCount
{
获取{return Children.OfType().Count(c=>c.Visibility==
可见性。可见);}
}
。。。并与之相联系:

<customGridView:MyUniformGrid x:Name="AlarmButtonGrid" Margin="0,10" Grid.Row="2" 
    Width="{Binding ActualWidth, ElementName=AlarmPictureBox}" Rows="{Binding 
    RelativeSource={RelativeSource Self}, Path=VisibleCount, Converter={
    StaticResource CountToDimensionConverter}, ConverterParameter=Rows}" Columns="{
    Binding RelativeSource={RelativeSource Self}, Path=VisibleCount, Converter={
    StaticResource CountToDimensionConverter}, ConverterParameter=Columns}">                    
    <Button x:Name="Button1" Content="Sluit" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5" />
    <Button x:Name="Button2" Content="Verbergen" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
    <Button x:Name="Button3" Visibility="Collapsed" Content="Extra rij" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
    <Button x:Name="Button4" Visibility="Collapsed" Content="Extra rij" Height="35" Style="{StaticResource CustomButtonStyle}" Margin="5"/>
</customGridView:MyUniformGrid>


需要注意的唯一一点是,每当您从
网格中添加或删除项时,您可能需要调用
INotifyPropertyChanged.PropertyChanged
事件。子项
集合。。。或者,您可以将其实现为一个
DependencyProperty

一种方法是在uniformgrid的add/remove方法中的UIElement上添加/删除侦听器到IsVisibleChanged

并将逻辑放入处理程序中,以根据可见子级计算行/列。这样就不需要行/列和转换器的自绑定

即,添加方法

   element.IsVisibleChanged += new DependencyPropertyChangedEventHandler(Child_IsVisibleChanged);
然后在handler中

    private void Child_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        int visibleChildrenCount = 0;
        for (int i = 0; i < grid.Children.Count; i++)
        {
            if (grid.Children[i].Visibility == Visibility.Visible)
            {
                visibleChildrenCount++;
            }
        }

        //Here you can set your Rows and Columns depending on visiblechildrenCount
    }
private void Child\u IsVisibleChanged(对象发送方,DependencyPropertyChangedEventArgs e)
{
int visibleChildrenCount=0;
for(int i=0;i
您可以创建单独的方法来执行此操作,并从addelement和removelement方法调用该方法。
在删除remove方法中的元素时,不要忘记删除处理程序。一种方法是在uniformgrid的add/remove方法中的UIElement上添加/删除侦听器到IsVisibleChanged

并将逻辑放入处理程序中,以根据可见子级计算行/列。这样就不需要行/列和转换器的自绑定

即,添加方法

   element.IsVisibleChanged += new DependencyPropertyChangedEventHandler(Child_IsVisibleChanged);
然后在handler中

    private void Child_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        int visibleChildrenCount = 0;
        for (int i = 0; i < grid.Children.Count; i++)
        {
            if (grid.Children[i].Visibility == Visibility.Visible)
            {
                visibleChildrenCount++;
            }
        }

        //Here you can set your Rows and Columns depending on visiblechildrenCount
    }
private void Child\u IsVisibleChanged(对象发送方,DependencyPropertyChangedEventArgs e)
{
int visibleChildrenCount=0;
for(int i=0;i
您可以创建单独的方法来执行此操作,并从addelement和removelement方法调用该方法。
在删除remove方法中的元素时,不要忘记删除处理程序

visibleCount始终返回0,即使我仅用Children.Count()替换linq也是如此。知道为什么吗?我在ObservaleIElementCollection添加/删除方法中已经有了PropertyChanged事件。在这里,您可以找到我的obseravbluementcollection类:
Children.Count()
仍然是
LinQ
<代码>子项。计数不正确。无论哪种方式,我认为都是因为item集合没有实现
INotifyPropertyChanged
接口。我知道你说过你实现了它,但我总是在NotifyPropertyChanged(“VisibleCount”)中添加一个“手动”调用;在从集合中添加或删除项的任何代码之后。。。它对我来说工作正常。这更好:Children.OfType().Count(c=>c.Visibility==Visibility.Visible);当然可以,如果您愿意的话。visibleCount始终返回0,即使我仅用Children.Count()替换您的linq。知道为什么吗?我在ObservaleIElementCollection添加/删除方法中已经有了PropertyChanged事件。在这里,您可以找到我的obseravbluementcollection类:
Children.Count()
仍然是
LinQ
<代码>子项。计数不正确。无论哪种方式,我认为都是因为item集合没有实现
INotifyPropertyChanged
接口。我知道你说过你实现了它,但我总是在NotifyPropertyChanged(“VisibleCount”)中添加一个“手动”调用;在从集合中添加或删除项的任何代码之后。。。它对我来说工作正常。这更好:Children.OfType().Count(c=>c.Visibility==Visibility.Visible);当然可以,如果你愿意的话。