ItemsControl
の使い方を、根本的に間違えています。
ItemsControl
はカスタマイズ性が高いのはいいのですが、すごいややこしいです^^;
まずここで大枠を確認してください。
ItemsControl 攻略 ~ 外観のカスタマイズ | grabacr.nét
実際にはこちらが、ほぼそのまま使えるかと思います。
wpf - Using a ScrollViewer with an ItemsControl with a Canvas as the ItemsPanel - Stack Overflow
xml
1<Window
2 x:Class="Q6fqs4vhmi2lp5m.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:local="clr-namespace:Q6fqs4vhmi2lp5m"
6 Width="600"
7 Height="450">
8 <Window.DataContext>
9 <local:ViewModel />
10 </Window.DataContext>
11 <DockPanel>
12 <Button
13 Command="{Binding AddCommand}"
14 Content="add"
15 DockPanel.Dock="Top" />
16
17 <ItemsControl ItemsSource="{Binding Collections}">
18 <!-- 子要素のレイアウトにCanvasを使用する -->
19 <ItemsControl.ItemsPanel>
20 <ItemsPanelTemplate>
21 <!-- Canvasのサイズを入れないとスクロールバーを出せない -->
22 <Canvas Width="{Binding CanvasWidth}" Height="{Binding CanvasHeight}" />
23 </ItemsPanelTemplate>
24 </ItemsControl.ItemsPanel>
25
26 <!-- 子要素のコンテナのスタイル -->
27 <ItemsControl.ItemContainerStyle>
28 <Style>
29 <!--
30 子要素(TextBox)は直接追加されるのではなく
31 ItemContainer(ContentPresenter)に包まれた上で追加されるため
32 ItemContainerに対してCanvas.Left・Topを設定する
33 -->
34 <Setter Property="Canvas.Left" Value="{Binding Left}" />
35 <Setter Property="Canvas.Top" Value="{Binding Top}" />
36 </Style>
37 </ItemsControl.ItemContainerStyle>
38
39 <!-- 子要素のテンプレート -->
40 <ItemsControl.ItemTemplate>
41 <DataTemplate>
42 <TextBox
43 Width="{Binding Width}"
44 Background="LightCyan"
45 Text="{Binding Name}" />
46 </DataTemplate>
47 </ItemsControl.ItemTemplate>
48
49 <!-- ItemsControl自体のテンプレート -->
50 <ItemsControl.Template>
51 <ControlTemplate>
52 <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
53 <ItemsPresenter HorizontalAlignment="Left" VerticalAlignment="Top" />
54 </ScrollViewer>
55 </ControlTemplate>
56 </ItemsControl.Template>
57 </ItemsControl>
58 </DockPanel>
59</Window>
cs
1using System.Collections.ObjectModel;
2using System.Linq;
3using System.Windows;
4using System.Windows.Input;
5using CommunityToolkit.Mvvm.ComponentModel;
6using CommunityToolkit.Mvvm.Input;
7
8namespace Q6fqs4vhmi2lp5m
9{
10 public class Item
11 {
12 public double Left { get; set; }
13 public double Top { get; set; }
14 public double Width { get; set; }
15 public string Name { get; set; }
16
17
18 private static int count; // 雑いw
19
20 public Item()
21 {
22 Left = Top = count * 50;
23 Width = 100;
24 Name = $"Name{count + 1}";
25 count++;
26 }
27 }
28
29 public class ViewModel : ObservableObject
30 {
31 public ObservableCollection<Item> Collections { get; }=new ObservableCollection<Item>();
32 public double CanvasWidth { get => _CanvasWidth; set => SetProperty(ref _CanvasWidth, value); }
33 private double _CanvasWidth;
34 public double CanvasHeight { get => _CanvasHeight; set => SetProperty(ref _CanvasHeight, value); }
35 private double _CanvasHeight;
36 public ICommand AddCommand { get; }
37
38 public ViewModel()
39 {
40 AddCommand = new RelayCommand(() =>
41 {
42 Collections.Add(new Item());
43 CanvasWidth = Collections.Max(x => x.Left + x.Width);
44 CanvasHeight = Collections.Max(x => x.Top + 30);
45 });
46
47 AddCommand.Execute(null);
48 }
49 }
50
51 public partial class MainWindow : Window
52 {
53 public MainWindow() => InitializeComponent();
54 }
55}
NuGet Gallery | CommunityToolkit.Mvvm 7.1.2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/14 21:46