更改ItemsControl的填充行为

时间:2018-05-15 08:26:46

标签: c# wpf xaml

ItemsControl,Listbox等从左上角一直填充到右下角。 反正有改变这种行为吗?我想从左下角到左上角填充列表。

我发现了这个article,但它对我没用。

<Grid>
    <ItemsControl ItemsSource="{Binding TheList}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:UniformGridWithOrientation Columns="2" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Beige" BorderThickness="2" Background="AliceBlue" Margin="5">
                    <Grid Margin="5">
                        <TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                    </Grid>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

这是我想要实现的目标:A就是我所拥有的。我想要的。

enter image description here

更新 这是解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls.Primitives;

namespace ListOrientation
{
    public class UniformGridWithOrientation : UniformGrid
    {
        #region Orientation (Dependency Property)
        public static readonly DependencyProperty OrientationProperty =
            DependencyProperty.Register("Orientation", typeof(System.Windows.Controls.Orientation), typeof(UniformGridWithOrientation),
                new FrameworkPropertyMetadata(
                    System.Windows.Controls.Orientation.Vertical,
                    FrameworkPropertyMetadataOptions.AffectsMeasure),
                new ValidateValueCallback(UniformGridWithOrientation.IsValidOrientation));

        internal static bool IsValidOrientation(object o)
        {
            System.Windows.Controls.Orientation orientation = (System.Windows.Controls.Orientation)o;
            if (orientation != System.Windows.Controls.Orientation.Horizontal)
            {
                return (orientation == System.Windows.Controls.Orientation.Vertical);
            }
            return true;
        }

        public System.Windows.Controls.Orientation Orientation
        {
            get { return (System.Windows.Controls.Orientation)GetValue(OrientationProperty); }
            set { SetValue(OrientationProperty, value); }
        }
        #endregion

        protected override Size MeasureOverride(Size constraint)
        {
            this.UpdateComputedValues();
            Size availableSize = new Size(constraint.Width / ((double)this._columns), constraint.Height / ((double)this._rows));
            double width = 0.0;
            double height = 0.0;
            int num3 = 0;
            int count = base.InternalChildren.Count;
            while (num3 < count)
            {
                UIElement element = base.InternalChildren[num3];
                element.Measure(availableSize);
                Size desiredSize = element.DesiredSize;
                if (width < desiredSize.Width)
                {
                    width = desiredSize.Width;
                }
                if (height < desiredSize.Height)
                {
                    height = desiredSize.Height;
                }
                num3++;
            }
            return new Size(width * this._columns, height * this._rows);
        }

        private void UpdateComputedValues()
        {
            this._columns = this.Columns;
            this._rows = this.Rows;
            if (this.FirstColumn >= this._columns)
            {
                this.FirstColumn = 0;
            }

            if (FirstColumn > 0)
                throw new NotImplementedException("There is no support for seting the FirstColumn (nor the FirstRow).");
            if ((this._rows == 0) || (this._columns == 0))
            {
                int num = 0;    // Visible children  
                int num2 = 0;
                int count = base.InternalChildren.Count;
                while (num2 < count)
                {
                    UIElement element = base.InternalChildren[num2];
                    if (element.Visibility != Visibility.Collapsed)
                    {
                        num++;
                    }
                    num2++;
                }
                if (num == 0)
                {
                    num = 1;
                }
                if (this._rows == 0)
                {
                    if (this._columns > 0)
                    {
                        this._rows = ((num + this.FirstColumn) + (this._columns - 1)) / this._columns;
                    }
                    else
                    {
                        this._rows = (int)Math.Sqrt((double)num);
                        if ((this._rows * this._rows) < num)
                        {
                            this._rows++;
                        }
                        this._columns = this._rows;
                    }
                }
                else if (this._columns == 0)
                {
                    this._columns = (num + (this._rows - 1)) / this._rows;
                }
            }
        }

        protected override Size ArrangeOverride(Size arrangeSize)
        {
            Rect finalRect = new Rect(0.0, 0.0, arrangeSize.Width / ((double)this._columns), arrangeSize.Height / ((double)this._rows));
            double height = finalRect.Height;
            double numX = arrangeSize.Height -1.0;
            double yPos = arrangeSize.Height - height;
            finalRect.X += finalRect.Width * this.FirstColumn;
            finalRect.Y += yPos;

            foreach (UIElement element in base.InternalChildren)
            {
                element.Arrange(finalRect);
                if (element.Visibility != Visibility.Collapsed)
                {

                    // Sortierung von unten links nach oben links
                    finalRect.X += finalRect.Width;
                    if (finalRect.X >= arrangeSize.Width)
                    {
                        finalRect.Y -= height;
                        finalRect.X = 0;
                    }
                }
            }
            return arrangeSize;
        }        

        private int _columns;
        private int _rows;
    }  
}

0 个答案:

没有答案