c#uwp GridView自定义面板

c#uwp GridView自定义面板,c#,windows-10,uwp,C#,Windows 10,Uwp,我仍在为GridView的自定义面板而挣扎(请参阅其他问题:) 我已使用自定义面板设置了GridView。现在,如果我将GridView选择模式从“多个”切换到“单个”,反之亦然,则自定义面板中的项目不会自动更新=>仅当我在“选择方块”上运行鼠标时,“选择方块”不会一次显示/隐藏所有项目 如果我使用ItemsWrapGrid,这就不会发生。。。我需要在自定义面板中实现哪个事件/方法 到目前为止,我的小组代码: using System; using System.Collections.Gene

我仍在为GridView的自定义面板而挣扎(请参阅其他问题:)

我已使用自定义面板设置了GridView。现在,如果我将GridView选择模式从“多个”切换到“单个”,反之亦然,则自定义面板中的项目不会自动更新=>仅当我在“选择方块”上运行鼠标时,“选择方块”不会一次显示/隐藏所有项目

如果我使用ItemsWrapGrid,这就不会发生。。。我需要在自定义面板中实现哪个事件/方法

到目前为止,我的小组代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using teachers_cal;
using teachers_cal.Classes;

namespace teachers_cal.UserControls
{
public class PRGD010_GridViewPanel : Panel
{
    public int NumberRowsOrColumns
    {
        get { return (int)GetValue(NumberRowsOrColumnsProperty); }
        set { SetValue(NumberRowsOrColumnsProperty, value < 1 ? 0 : value); }
    }

    public static readonly DependencyProperty NumberRowsOrColumnsProperty = DependencyProperty.Register("NumberRowsOrColumns", typeof(int), typeof(PRGD010_GridViewPanel), new PropertyMetadata(1, OnNumberRowsOrColumnsPropertyChanged));
    private static void OnNumberRowsOrColumnsPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        (source as PRGD010_GridViewPanel).InvalidateMeasure();
    }

    public int Offset
    {
        get { return (int)GetValue(StartPositionProperty); }
        set { SetValue(StartPositionProperty, value >= this.NumberRowsOrColumns ? this.NumberRowsOrColumns - 1 : value); }
    }

    public static readonly DependencyProperty StartPositionProperty = DependencyProperty.Register("Offset", typeof(int), typeof(PRGD010_GridViewPanel), new PropertyMetadata(0, OnStartPositionPropertyChanged));
    private static void OnStartPositionPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        (source as PRGD010_GridViewPanel).InvalidateMeasure();
    }

    public PRGD010_GridViewPanel()
    {
    }

    /// Get Items Source count items
    private int GetItemsCount()
    {
        return this.Children != null ? this.Children.Count : 0;
    }

    /// Get Calculated Row or Column count. Depending on Offset, Numbers and Items
    private int GetRowsOrColumnsCount()
    {
        int additionalLine = ((GetItemsCount() + this.Offset)) % this.NumberRowsOrColumns > 0 ? 1 : 0;
        return ((GetItemsCount() + this.Offset)) / this.NumberRowsOrColumns + additionalLine;
    }


    /// <summary>
    /// Arrange all items
    /// </summary>
    protected override Size ArrangeOverride(Size finalSize)
    {

        // Clip to ensure items dont override container
        this.Clip = new RectangleGeometry { Rect = new Rect(0, 0, finalSize.Width, finalSize.Height) };

        Double positionTop = 0d;
        double positionGrid = this.Offset;
        double test = this.NumberRowsOrColumns;

        // Must Create looping items count
        foreach (UIElement item in this.Children)
        {
            if (item == null)
                continue;

            Size desiredSize = item.DesiredSize;

            if (double.IsNaN(desiredSize.Width) || double.IsNaN(desiredSize.Height)) continue;

            // Get rect position
            var rect = new Rect(positionGrid * desiredSize.Width, positionTop, desiredSize.Width, desiredSize.Height);
            item.Arrange(rect);

            // set internal CompositeTransform to handle movement
            TranslateTransform compositeTransform = new TranslateTransform();
            item.RenderTransform = compositeTransform;

            if (positionGrid < this.NumberRowsOrColumns - 1) { positionGrid += 1; }
            else
            {
                positionGrid = 0;
                positionTop += desiredSize.Height;
            }
        }

        return finalSize;
    }

    /// <summary>
    /// Measure items 
    /// </summary>
    protected override Size MeasureOverride(Size availableSize)
    {

        //Size s = base.MeasureOverride(availableSize);

        // set good cliping
        //this.Clip = new RectangleGeometry { Rect = new Rect(0, 0, s.Width, s.Height) };

        // Measure all items
        foreach (UIElement container in this.Children)
        {
            container.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
        }

        double width = Children[0]?.DesiredSize.Width ?? 0;
        double height = Children[0]?.DesiredSize.Height ?? 0;
        var i = GetRowsOrColumnsCount();

        return (new Size(width * (double)NumberRowsOrColumns, height * (double)GetRowsOrColumnsCount()));
        //return (new Size(3000, 3000));
    }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Windows基金会;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Media;
使用教师卡;
利用教师授课;
名称空间教师\u cal.UserControls
{
公共类PRGD010_GridViewPanel:面板
{
公共整数箭头或列
{
获取{return(int)GetValue(NumberRowsOrColumnsProperty);}
set{SetValue(NumberRowsOrColumnsProperty,value<1?0:value);}
}
public static readonly dependencProperty NumberRowsOrColumnsProperty=dependencProperty.Register(“NumberRowsOrColumns”、typeof(int)、typeof(PRGD010\u GridViewPanel)、新属性元数据(1、onnumberrowsorcolumnsproperty变更));
NumberRowsorColumnSPropertyChanged上的私有静态无效(DependencyObject源,DependencyPropertyChangedEventArgs e)
{
(来源为PRGD010_GridViewPanel)。无效测量();
}
公共整数偏移
{
get{return(int)GetValue(StartPositionProperty);}
set{SetValue(StartPositionProperty,value>=this.NumberRowsOrColumns?this.NumberRowsOrColumns-1:value);}
}
公共静态只读DependencyProperty StartPositionProperty=DependencyProperty.Register(“偏移量”、typeof(int)、typeof(PRGD010_GridViewPanel)、新属性元数据(0,OnStartPositionPropertyChanged));
私有静态无效OnStartPositionPropertyChanged(DependencyObject源,DependencyPropertyChangedEventArgs e)
{
(来源为PRGD010_GridViewPanel)。无效测量();
}
公共PRGD010_GridViewPanel()
{
}
///获取项目源计数项目
私有int getItemScont()
{
返回this.Children!=null?this.Children.Count:0;
}
///获取计算的行或列计数。取决于偏移量、数字和项目
private int getrowsorcolumnsunt()
{
int additionalLine=((GetItemsCount()+this.Offset))%this.numberRowOrColumns>0?1:0;
return((getItemScont()+this.Offset))/this.NumberRowsOrColumns+附加行;
}
/// 
///安排所有项目
/// 
受保护的替代尺寸排列替代(尺寸最终化)
{
//剪辑以确保项目不会覆盖容器
this.Clip=new RectangleGeometry{Rect=new Rect(0,0,finalSize.Width,finalSize.Height)};
双位置顶部=0d;
双位置网格=该偏移量;
双重测试=此.NumberRowsOrColumns;
//必须创建循环项计数
foreach(此.Children中的UIElement项)
{
如果(项==null)
继续;
大小desiredSize=项目。desiredSize;
如果(double.IsNaN(desiredSize.Width)| double.IsNaN(desiredSize.Height))继续;
//得到正确的位置
var rect=新的rect(位置网格*desiredSize.Width,位置顶部,desiredSize.Width,desiredSize.Height);
项目安排(rect);
//设置内部CompositeTransform以处理移动
TranslateTransform compositeTransform=新的TranslateTransform();
item.RenderTransform=复合转换;
如果(positionGrid
编辑: 我创建了两个简单的项目。即使使用标准的ItemPanel,我也会有奇怪的行为。真令人沮丧

  • 将GridView与VariableSizeWrapGrid一起使用更改SelectionMode时,GridViewItems将无法正确刷新

  • 对ItemsWrapGrip执行相同的操作是可以的。更改选择模式将正确显示

  • 有人能找出为什么会这样吗?怎么办

    查看两个链接

    谢谢你的回复