前提・実現したいこと
StackPanelで並んでいるどのItemをドラッグしてもすべてのItemの幅を変更したい。
以下のXamlのようにItemsControlでStackPanelとThumbを使用しています。
ThumbのドラッグイベントでList内のItemの幅を変更しています。
用途・シナリオとしては、画像を並べて表示し、画像間のマージンをD&Dで変更するようなケースを想定しています。
発生している問題・エラーメッセージ
e.HorizontalChangeの移動量が大きく、正しくサイズ変更ができません。
ドラッグに追従して幅を変更する方法はありませんか?
該当のソースコード
Xaml
1<Window x:Class="BlankCoreApp2.Views.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 6 prism:ViewModelLocator.AutoWireViewModel="True" 7 Title="{Binding Title}" Height="350" Width="525" > 8 <Grid> 9 <ItemsControl ItemsSource="{Binding List}" Margin="50"> 10 <ItemsControl.ItemsPanel> 11 <ItemsPanelTemplate> 12 <StackPanel Orientation="Horizontal" Background="Green"/> 13 </ItemsPanelTemplate> 14 </ItemsControl.ItemsPanel> 15 <ItemsControl.ItemTemplate> 16 <DataTemplate> 17 <Grid> 18 <Rectangle x:Name="rectangle" 19 Width="{Binding Width}" 20 Height="{Binding Height}" 21 Stroke="Red" 22 StrokeThickness="1" 23 Fill="Yellow"/> 24 <Thumb x:Name="rectangleThumb" 25 DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}" 26 Background="Transparent" 27 Width="{Binding Width, ElementName=rectangle}" 28 Height="{Binding Height, ElementName=rectangle}" 29 Opacity="0"> 30 <i:Interaction.Triggers> 31 <i:EventTrigger EventName="DragDelta"> 32 <prism:InvokeCommandAction Command="{Binding DragDeltaCommand}"/> 33 </i:EventTrigger> 34 </i:Interaction.Triggers> 35 </Thumb> 36 </Grid> 37 </DataTemplate> 38 </ItemsControl.ItemTemplate> 39 </ItemsControl> 40 </Grid> 41</Window>
C#
1 public class MainWindowViewModel : BindableBase 2 { 3 private string _title = "Prism Application"; 4 public string Title 5 { 6 get { return _title; } 7 set { SetProperty(ref _title, value); } 8 } 9 public enum Direction 10 { 11 Horizontal, 12 Vertical 13 } 14 ObservableCollection<Item> _list = new ObservableCollection<Item>(); 15 public ObservableCollection<Item> List 16 { 17 get { return _list; } 18 set { SetProperty(ref _list, value); } 19 } 20 public MainWindowViewModel() 21 { 22 for (int i = 0; i < 10; i++) 23 { 24 List.Add(new Item() { Width = 50, Height = 50 }); 25 } 26 } 27 28 private DelegateCommand<DragDeltaEventArgs> _dragDeltaCommand; 29 public DelegateCommand<DragDeltaEventArgs> DragDeltaCommand 30 { 31 get 32 { 33 if (_dragDeltaCommand == null) 34 _dragDeltaCommand = new DelegateCommand<DragDeltaEventArgs>(e => MarginDragDelta(e, Direction.Horizontal)); 35 return _dragDeltaCommand; 36 } 37 } 38 public void MarginDragDelta(DragDeltaEventArgs e, Direction direction) 39 { 40 List.Select(x => x.Width += (int)e.HorizontalChange).ToList(); 41 } 42 } 43 44 public class Item : BindableBase 45 { 46 private int _width = 0; 47 private int _height = 0; 48 49 50 public int Width 51 { 52 get { return _width; } 53 set { SetProperty(ref _width, value); } 54 } 55 56 public int Height 57 { 58 get { return _height; } 59 set { SetProperty(ref _height, value); } 60 } 61 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/08 14:12