【问题标题】:WPF - Custom panel size to contentWPF - 自定义面板大小到内容
【发布时间】:2013-11-16 13:49:29
【问题描述】:

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

我希望我的面板根据内容调整大小。

我的 MesureOverride:

 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;
 }

我的 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];

            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;
    }

我的面板的 ActualWidth 和 Height 等于 finalSize ,我希望面板的尺寸是从 MeasureOvride (constraint) 返回的尺寸,

如果我强制这样做,我的面板在屏幕上的位置不同,我只想让我的面板大小适合它的内容,如 WrapPanel 或 StackPanel,

使用 finalSize

约束大小 (100,100) 用于测试目的

我对面板的使用: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>

【问题讨论】:

    标签: wpf layout panel measureoverride arrangeoverride


    【解决方案1】:

    很抱歉,我第一次误会了你。

    看看这个:

    <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 的外观。 MeasureOverride 可能保持不变。

    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);
    }
    

    看看这张照片。该面板适合我的内容。

    【讨论】:

    【解决方案2】:

    根据 dev hidehod 所说的 Grid 是伸展我的面板的父级来构建应用程序, 我没想到这一点,我认为 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2012-07-16
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多