WPF-根据内容自定义面板大小
我的面板尝试执行类似于UniformGrid的操作,除了ItemContainerWidth(40.0)和ItemContainerHeight(20.0)依赖属性之外,它还有一个ColumnNumber属性 我希望我的面板大小与其内容相符 我的测量:WPF-根据内容自定义面板大小,wpf,layout,panel,measureoverride,arrangeoverride,Wpf,Layout,Panel,Measureoverride,Arrangeoverride,我的面板尝试执行类似于UniformGrid的操作,除了ItemContainerWidth(40.0)和ItemContainerHeight(20.0)依赖属性之外,它还有一个ColumnNumber属性 我希望我的面板大小与其内容相符 我的测量: protected override Size MeasureOverride(Size constraint) { if (constraint.Width == double.PositiveInfini
protected override Size MeasureOverride(Size constraint)
{
if (constraint.Width == double.PositiveInfinity || constraint.Height == double.PositiveInfinity)
return Size.Empty;
for (int i = 0; i < InternalChildren.Count; i++)
{
InternalChildren[i].Measure(new Size(ItemContainerWidth, ItemContainerHeight));
}
return constraint;
}
protected override Size ArrangeOverride(Size finalSize)
{
int currentColumn = 0;
int currentRow = 0 ;
for (int i = 0; i < InternalChildren.Count; i++)
{
UIElement child = InternalChildren[i];
if (currentColumn == ColumnCount)
{
currentColumn = 0;
currentRow++;
}
currentColumn++;
double top = currentRow * ItemContainerHeight;
double left = currentColumn * ItemContainerWidth;
child.Arrange(new Rect(left, top, ItemContainerWidth, ItemContainerHeight));
}
return finalSize;
}
受保护的覆盖尺寸测量覆盖(尺寸约束)
{
if(constraint.Width==double.PositiveInfinity | | constraint.Height==double.PositiveInfinity)
返回大小。空;
for(int i=0;i
我的安排:
protected override Size MeasureOverride(Size constraint)
{
if (constraint.Width == double.PositiveInfinity || constraint.Height == double.PositiveInfinity)
return Size.Empty;
for (int i = 0; i < InternalChildren.Count; i++)
{
InternalChildren[i].Measure(new Size(ItemContainerWidth, ItemContainerHeight));
}
return constraint;
}
protected override Size ArrangeOverride(Size finalSize)
{
int currentColumn = 0;
int currentRow = 0 ;
for (int i = 0; i < InternalChildren.Count; i++)
{
UIElement child = InternalChildren[i];
if (currentColumn == ColumnCount)
{
currentColumn = 0;
currentRow++;
}
currentColumn++;
double top = currentRow * ItemContainerHeight;
double left = currentColumn * ItemContainerWidth;
child.Arrange(new Rect(left, top, ItemContainerWidth, ItemContainerHeight));
}
return finalSize;
}
受保护的替代大小排列替代(大小最终化)
{
int currentColumn=0;
int currentRow=0;
for(int i=0;i
我的面板的实际宽度和高度等于finalSize,我希望面板的大小是从MeasureOvride(constraint)返回的大小
如果我强制这样做,我的面板在屏幕上的位置不同,我只希望我的面板大小与它的内容类似,如WrapPanel或StackPanel
最终化
带有用于测试的约束大小(100100)
我对面板的使用:XAML:
<Grid>
<ItemsControl ItemsSource="{Binding Items, Mode=OneWay}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<uni:ScrollableUniformGrid ColumnCount="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,0,1,1">
<TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
很抱歉,我第一次误解了你的意思 看看这个:
<Grid>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:ScrollableUniformGrid HorizontalAlignment="Left" VerticalAlignment="Top" ColumnCount="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,0,1,1">
<TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
这就是您的ArrangeOverride的外观。测量值可能保持不变
protected override Size ArrangeOverride(Size finalSize)
{
int currentColumn = 0;
int currentRow = 0;
for (int i = 0; i < InternalChildren.Count; i++)
{
UIElement child = InternalChildren[i];
double top = currentRow * ItemContainerHeight;
double left = currentColumn * ItemContainerWidth;
if (currentColumn == ColumnCount)
{
currentColumn = 0;
currentRow++;
}
else
{
currentColumn++;
}
child.Arrange(new Rect(left, top, ItemContainerWidth, ItemContainerHeight));
}
return new Size((ColumnCount + 1) * ItemContainerWidth, (currentRow + 1) * ItemContainerHeight);
}
受保护的替代大小排列替代(大小最终化)
{
int currentColumn=0;
int currentRow=0;
for(int i=0;i
看看这张照片。这个面板适合我
很抱歉,我第一次误解了你的意思 看看这个:
<Grid>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:ScrollableUniformGrid HorizontalAlignment="Left" VerticalAlignment="Top" ColumnCount="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,0,1,1">
<TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
这就是您的ArrangeOverride的外观。测量值可能保持不变
protected override Size ArrangeOverride(Size finalSize)
{
int currentColumn = 0;
int currentRow = 0;
for (int i = 0; i < InternalChildren.Count; i++)
{
UIElement child = InternalChildren[i];
double top = currentRow * ItemContainerHeight;
double left = currentColumn * ItemContainerWidth;
if (currentColumn == ColumnCount)
{
currentColumn = 0;
currentRow++;
}
else
{
currentColumn++;
}
child.Arrange(new Rect(left, top, ItemContainerWidth, ItemContainerHeight));
}
return new Size((ColumnCount + 1) * ItemContainerWidth, (currentRow + 1) * ItemContainerHeight);
}
受保护的替代大小排列替代(大小最终化)
{
int currentColumn=0;
int currentRow=0;
for(int i=0;i
看看这张照片。这个面板适合我
要构建appon,正如dev hedgehod所说,网格是延伸我的面板的母体, 我没有想到这一点,我以为ItemsControl是从我的面板设置边界的控件 最后我做了以下操作,在列和行定义中将宽度和高度设置为“自动” XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ItemsControl ItemsSource="{Binding Items, Mode=OneWay}" Background="AliceBlue">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<uni:ScrollableUniformGrid ColumnCount="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,0,1,1">
<TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
要构建appon,正如dev hedgehod所说,网格是延伸我的面板的母体, 我没有想到这一点,我以为ItemsControl是从我的面板设置边界的控件 最后我做了以下操作,在列和行定义中将宽度和高度设置为“自动” XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ItemsControl ItemsSource="{Binding Items, Mode=OneWay}" Background="AliceBlue">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<uni:ScrollableUniformGrid ColumnCount="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,0,1,1">
<TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
您的Items控件放在哪里?DockPanel?StackPanel?请看一下答案。您的Items控件放在哪里?DockPanel?StackPanel?请看答案。它有效吗,我不知道源代码了吗?你试过了吗?好的,我知道你做了什么,我认为唯一的改变是返回的大小需要调整覆盖。我还没有检查我的邮件。很抱歉唯一的变化是安排