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