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

ItemsControl中WPF中的可拖动对象?

  •  4
  • Kelly  · 技术社区  · 15 年前

    我希望能够实现一个带有可拖动项的ItemsControl。ItemsControl的原因是我可以在后台绑定到我的ViewModel。

            <ItemsControl ItemsSource="{Binding MyItems}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Thumb Canvas.Left="0" Canvas.Top="0" Width="50" Height="50" DragDelta="MyThumb_DragDelta"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
    
        </ItemsControl>
    

    背后的代码:

        public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            DataContext = new MainViewModel();
        }
    
        private void MyThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            Canvas.SetLeft((UIElement)sender, Canvas.GetLeft((UIElement)sender) + e.HorizontalChange);
            Canvas.SetTop((UIElement)sender, Canvas.GetTop((UIElement)sender) + e.VerticalChange);
        }
    

    最后是我的ViewModel:

        public class MainViewModel : DependencyObject 
    {
        public ObservableCollection<Note> MyItems { get; set;}
    
    
        public MainViewModel()
        {
            MyItems = new ObservableCollection<Note>();
            MyItems.Add(new Note(){Name="test"});
        }
    
    }
    
    public class Note : INotifyPropertyChanged 
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        private string name;
    
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                if(PropertyChanged!=null) PropertyChanged(this,new PropertyChangedEventArgs("Name"));
            }
        }
    
    
    }
    

      <Canvas>
            <Thumb Canvas.Left="0" Canvas.Top="0" Width="50" Height="50" DragDelta="MyThumb_DragDelta"/>            
        </Canvas>
    

    但当我把它放在ItemsControl中时,它就不工作了。我假设ItemsControl正在注册鼠标事件并重写Thumb?

    有人有好的解决办法让它工作吗?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Kelly    15 年前

    <ItemsControl ItemsSource="{Binding Notes}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Thumb Width="150" Height="150" DragDelta="Thumb_DragDelta" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Canvas.Left" Value="{Binding X}" />
                    <Setter Property="Canvas.Top" Value="{Binding Y}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
    

     public partial class MainWindow : Window
    {
        public ObservableCollection<Note> Notes { get; set; }
    
        public MainWindow()
        {
            InitializeComponent();
    
            DataContext = this;
    
            Notes = new ObservableCollection<Note>();
            Notes.Add(new Note(){Title="test", X=100, Y=0});
        }
    
        private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            Note n = (Note)((FrameworkElement)sender).DataContext;
            n.X += e.HorizontalChange;
            n.Y += e.VerticalChange;
        }
    }
    
    public class Note : INotifyPropertyChanged
    {
        private string title;
        private double x;
        private double y;
    
        public double Y
        {
            get { return y; }
            set
            {
                y = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Y"));
            }
        }
    
        public double X
        {
            get { return x; }
            set
            {
                x = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("X"));
            }
        }
    
    
        public string Title
        {
            get { return title; }
            set
            {
                title = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Title"));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        2
  •  1
  •   benPearce    15 年前

    <Style x:Key="ThumbStyle">
      <Setter Property="Canvas.Left" Value="{Binding Path=Left}"/>
      <Setter Property="Canvas.Top" Value="{Binding Path=Top}"/>
      <!-- more if required -->
    
    </Style>
    

    然后拇指变成:

    <Thumb Style={StaticResource ThumbStyle}" ... />