Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF-根据内容自定义面板大小_Wpf_Layout_Panel_Measureoverride_Arrangeoverride - Fatal编程技术网

WPF-根据内容自定义面板大小

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

我的面板尝试执行类似于UniformGrid的操作,除了ItemContainerWidth(40.0)和ItemContainerHeight(20.0)依赖属性之外,它还有一个ColumnNumber属性

我希望我的面板大小与其内容相符

我的测量:

 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?请看答案。它有效吗,我不知道源代码了吗?你试过了吗?好的,我知道你做了什么,我认为唯一的改变是返回的大小需要调整覆盖。我还没有检查我的邮件。很抱歉唯一的变化是安排