0

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>

Children.Count へのバインディング

この投稿で、グリッドの Children.count が実際に機能するようにカスタムの UniformGrid を作成する必要があることがわかったので、それを行いました。

このコードはすべて機能しますが、1 つ問題が残っています。

これらのボタンは、動的に表示または折りたたむことができます。ボタンが折りたたまれたときに、行数に影響を与えたくありません。ボタン 3 と 4 が折りたたまれているときは、2 行目を表示したくありません。

これを達成する方法はありますか?

4

2 に答える 2

1

これを行う 1 つの方法は、uniformgrid の Add/Remove メソッドで UIElement の IsVisibleChanged にリスナーを追加/削除することです。

そして、Visible の子に依存する行/列を計算するロジックをハンドラーに入れます。行/列とコンバーターの自己バインディングは必要ありません。

すなわち。メソッドの追加で

   element.IsVisibleChanged += new DependencyPropertyChangedEventHandler(Child_IsVisibleChanged);

そしてハンドラーで

    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
    }

これを行う別のメソッドを作成し、そのメソッドを Add element から呼び出して要素メソッドを削除することもできます。Remove メソッドで要素を削除するときにハンドラーを削除することを忘れないでください

于 2013-10-01T10:33:23.080 に答える