代码之家  ›  专栏  ›  技术社区  ›  Gregyski

拉伸控件以填充Items控件

  •  22
  • Gregyski  · 技术社区  · 16 年前

    Button

    <ItemsControl x:Name="itemscontrolButtons" ItemsSource="{Binding}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Button Tag="{Binding}">
            <TextBlock Text="{Binding}" />
          </Button>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    </ItemsControl>
    ...    
    List<string> listButtonTexts = new List<string>() { "Button1", "Button2" };
    ...
    itemscontrolButtons.DataContext = listButtonTexts;
    

    alt text

    Grid 而不是 StackPanel

    3 回复  |  直到 10 年前
        1
  •  51
  •   Nir    16 年前

    <ItemsControl>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="1"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
    
        2
  •  2
  •   Spooky Muscothym    10 年前

    。为此,您需要存储对它的引用。有 multiple methods for accomplishing this

    <ItemsControl ItemsSource="{Binding}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <UniformGrid Rows="1" Loaded="UniformGrid_Loaded" />
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    </ItemsControl>
    

    UniformGrid uniformgridButtons;
    private void UniformGrid_Loaded(object sender, RoutedEventArgs e)
    {
      uniformgridButtons = sender as UniformGrid;
    }
    

    然后,处理 事件,并根据您想要的任何标准调整行参数。

    private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
    {
      if ((uniformgridButtons != null) && (this.Width > 0))
      {
        // Set row count according to your requirements
        uniformgridButtons.Rows = (int)(1 + ((this.MinWidth * iButtonCount) / this.Width));
      }
    }
    

    因此,这允许WPF像Nir的答案一样管理拉伸,但允许您显式调整行数。上面的代码给出了这个结果:

    alt text

    here )


    2009/08/28更新:

    ItemsControl DataTemplate ResourceDictionary Loaded UniformGrid

    我转而使用 Alan Haigh's FindItemsPanel method (10th reply) 首先,我更换了

    <ContentPresenter x:Name="contentpresenterButtons" Content="{Binding obscolButtons}" />
    

    资源字典 ,我把 :

    <DataTemplate DataType="{x:Type local:Buttons}">
      <ItemsControl ... 
    </DataTemplate>
    

    private void Window_Loaded(object sender, RoutedEventArgs e) {
      uniformgridButtons = FindItemsPanel<UniformGrid>(contentpresenterButtons);
      // Also call the code in Window_SizeChanged which I put in another method
    }
    

    资源字典 .

        3
  •  0
  •   golden_eagle    16 年前
    <!-- width must be explicitly set for this example -->
    <StackPanel 
        Name="MyStack" 
        Orientation="Horizontal"
        Width="250"
        Load="Window_Loaded"> 
        <Button/>
        <Button/>
        <Button/>
    </StackPanel>
    

    public void Window_Loaded(object sender, RoutedEventArgs e)
    {
        UIElementCollection elements = MyStack.Children;
        int count = elements.Count;
    
        foreach (UIElement element in elements)
        {
            if (element is Button)
                ((Button)element).Width = MyStack.Width / count;
        }
    }
    
    推荐文章