ItemsControl พร้อมการวางแนวนอน


225

คุณรู้การควบคุมใด ๆ ที่สืบทอดมาจาก ItemsControl ที่มีการวางแนวของรายการหรือไม่?

คำตอบ:


463

เพียงเปลี่ยนพาเนลที่ใช้เพื่อโฮสต์รายการ:

<ItemsControl ...>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

คุณไม่จำเป็นต้องเพิ่ม IsItemsHost = "True" ไปยัง StackPanel
โทมัส Levesque

5
ฉันเชื่อว่านั่นเป็นสิ่งที่จำเป็นเฉพาะเมื่อคุณทำการควบคุมทั้งหมดซ้ำอีกครั้ง ดูmsdn.microsoft.com/en-us/library/…
Kent Boogaart

3
คำตอบก็มีไว้สำหรับ Silverlight
สกอตต์

วิธีการทำเช่นนี้ในไฟล์ทรัพยากร?
Florian

ในการทำเช่นนี้ในไฟล์ทรัพยากรคุณต้องตั้งค่าคีย์ x: คีย์
Tore Aurstad

32

ในขณะที่คำตอบที่ได้รับการเลื่อนตำแหน่งนั้นยอดเยี่ยมนี่เป็นอีกทางเลือกหนึ่งหากคุณต้องการให้รายการยืดออก

<ItemsControl.ItemsPanel>                              
    <ItemsPanelTemplate>
        <UniformGrid Rows="1" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>   

หากคุณกำลังใช้ UWP คุณจะต้อง UWP-UniformGrid จากที่นี่: github.com/rickapps/UWP-UniformGrid-Control ฉันเพิ่งนำไปใช้รวมถึงโซลูชันของ NielW ด้านบน ง่ายมากและแก้ปัญหา
Gail Foad

9

คำตอบที่ดี แต่ฉันไม่สามารถใช้งานได้กับ UserControls หากคุณต้องการ UserControls สิ่งนี้จะช่วยได้

ItemsControl พร้อมแนวนอน Usercontrols

รุ่นของฉัน:

<Window.Resources>
    <DataTemplate x:Key="ItemTemplate2">
        <StackPanel>
            <uc:MyUserControl MinWidth="20" BorderBrush="Black" BorderThickness="0.1" />
        </StackPanel>
    </DataTemplate>

    <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0"/>
    </ItemsPanelTemplate>
</Window.Resources>

<StackPanel>
    <ItemsControl x:Name="list_MyControls"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Top"
                  Margin="0,8,0,0"
                  ItemTemplate="{StaticResource ItemTemplate2}"
                  ItemsPanel="{StaticResource ItemsPanelTemplate1}" />
</StackPanel>

ในการผูกเข้ากับข้อมูลคุณจะต้องเพิ่มItemsSourceเข้าไปItemsControlในใน XAML หรือโค้ดด้านหลัง นอกจากนี้โปรดทราบว่าuc:จะมีการxmlns:uc="NamespaceOfMyControl"ประกาศที่ด้านบนของไฟล์


ฉันไม่คุ้นเคยกับการใช้ WPF ดังนั้นบางทีสิ่งที่ฉันจะพูดเป็นสิ่งพื้นฐานมาก ฉันพบว่าภายใน UserControl คุณควรใช้ "UserControl.Resources" แทน "Window.Resources" อย่างไรก็ตามขอบคุณสำหรับคำตอบที่ดีแก้ไขปัญหาของฉัน
เปาโลAndré Haacke

9

นี่คือตัวอย่างของวิธีการเลื่อนแนวนอนภายใน ItemsControl

ก่อนอื่นคลาสหน้าต่างหลัก viewmodel จะใช้เพื่อรับ / ตั้งค่ารายการที่เราต้องการแสดง

MainWindowViewModel.cs

using System.Collections.Generic;

namespace ItemsControl
{
   public class Item
   {
      public Item(string title)
      {
         Title = title;
      }

      public string Title { get; set; }
   }

   public class MainWindowViewModel
   {
      public MainWindowViewModel()
      {
         Titles = new List<Item>()
         {
            new Item("Slide 1"),
            new Item("Slide 2"),
            new Item("Slide 3"),
            new Item("Slide 4"),
            new Item("Slide 5"),
            new Item("Slide 6"),
            new Item("Slide 7"),
            new Item("Slide 8"),
         };
      }

      public List<Item> Titles { get; set; }
   }
}

หน้าต่างหลัก xaml สำหรับมุมมอง:

MainWindow.xaml

    <Window x:Class="ItemsControl.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ItemsControl"      
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">

    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>

    <Grid Margin="5">
        <ScrollViewer
            VerticalScrollBarVisibility="Disabled"
            HorizontalScrollBarVisibility="Auto">

            <ItemsControl
                x:Name="SearchResultList"                
                ItemsSource="{Binding Titles}">

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>

                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Border
                            Margin="5"
                            BorderThickness="1"
                            BorderBrush="Aqua">

                            <TextBlock
                                Text="{Binding Title}"
                                HorizontalAlignment="Center"                               
                                VerticalAlignment="Top"
                                FontSize="12"
                                TextWrapping="Wrap"
                                TextAlignment="Center"
                                FontWeight="DemiBold"  
                                Width="150"
                                Height="150" />
                        </Border>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>

            </ItemsControl>
        </ScrollViewer>

    </Grid>
</Window>

ขึ้นอยู่กับความสูง / กว้างของพื้นที่ลูกค้าของคุณสิ่งนี้จะส่งผลให้มีเลย์เอาต์แบบนี้รายการล้นจะเลื่อนตามแนวนอน:

ป้อนคำอธิบายรูปภาพที่นี่

รายละเอียดเพิ่มเติมสามารถดูได้ที่ลิงค์บล็อกนี้รวมถึงตัวอย่างเกี่ยวกับวิธีการเลื่อนแนวตั้ง:

http://www.technical-recipes.com/2017/how-to-orient-wrappanel-items-within-itemscontrol-lists-vertically-and-horizontally/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.