MụcControl với hướng ngang


225

Bạn có biết bất kỳ điều khiển nào được kế thừa từ ItemControl có hướng ngang của các mục không?

Câu trả lời:


463

Chỉ cần thay đổi bảng điều khiển được sử dụng để lưu trữ các mục:

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

Bạn không cần thêm IsItemshost = "True" vào StackPanel?
Thomas Levesque

5
Tôi tin rằng điều đó chỉ cần thiết nếu bạn tái lập toàn bộ điều khiển. Xem msdn.microsoft.com/en-us/l Library / Mạnh
Kent Boogaart

3
Câu trả lời cũng được giữ cho Silverlight
Scott

Làm thế nào để làm điều này trong một tập tin tài nguyên?
Florian

Để thực hiện việc này trong tệp tài nguyên, bạn cần đặt khóa x: Key
Tore Aurstad

32

Mặc dù câu trả lời được quảng cáo là tuyệt vời, đây là một lựa chọn thay thế nếu bạn muốn các mặt hàng được kéo dài.

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

Nếu bạn đang sử dụng UWP, bạn sẽ cần UWP-UniformGrid từ đây: github.com/rickapps/UWP-UniformGrid-Control . Tôi chỉ thực hiện nó cộng với giải pháp của NielW ở trên. Thực sự dễ dàng và giải quyết vấn đề.
Gail Foad

9

Câu trả lời hàng đầu là tốt, nhưng tôi không thể làm cho nó hoạt động với UserControls. Nếu bạn cần UserControls, điều này sẽ giúp.

Mục Kiểm soát với Usercontrols ngang

Phiên bản của tôi:

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

Liên kết với dữ liệu, bạn sẽ cần phải thêm một ItemsSourceđến ItemsControltrong XAML hoặc đằng sau mã. Cũng lưu ý rằng đó uc:sẽ là xmlns:uc="NamespaceOfMyControl"khai báo ở đầu tệp.


Tôi không quen sử dụng WPF, vì vậy có lẽ những gì tôi sẽ nói là những thứ rất cơ bản. Tôi phát hiện ra rằng bên trong UserControl, bạn nên sử dụng "UserControl.Resource" thay vì "Window.Resource". Dù sao, cảm ơn câu trả lời tuyệt vời, đã giải quyết vấn đề của tôi.
Paulo André Haacke

9

Đây là một ví dụ về cách thực hiện cuộn ngang trong ItemControl.

Đầu tiên, lớp viewmodel cửa sổ chính được sử dụng để lấy / thiết lập danh sách các mục chúng tôi muốn hiển thị.

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

Cửa sổ chính xaml cho chế độ xem:

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>

Tùy thuộc vào mức độ cao / rộng của khu vực khách hàng của bạn, điều này sẽ dẫn đến kiểu bố trí này, các mục tràn được cuộn theo chiều ngang:

nhập mô tả hình ảnh ở đây

Thông tin chi tiết có thể được tìm thấy tại liên kết blog này, bao gồm một ví dụ về cách thực hiện cuộn theo chiều dọc:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.