2013-10-11 4 views
0

Итак, моя проблема в том, что я пытаюсь переместить некоторые пользовательские элементы управления на холст.Mousemoving Usercontrol in canvas WPF

Это действительно работает очень хорошо, если указатель мыши находится внутри док-панели, из которой сделан пользовательский контроль. Однако внутри док-панели есть несколько элементов управления, и если я нажимаю на них и пытаюсь переместить их, генерируется исключение, указывая что-то вроде «Невозможно наложить объект типа« System.String »на тип« UMLDesigner.Model » . .Node» Это имеет смысл, но есть способ, чтобы получить DockPanel, вместо ItemsControl, несмотря на то, что в ItemsControl, который щелкнул

существует соответствующий C# код:

public void MouseMoveNode(MouseEventArgs e) 
    { 
     //Is the mouse captured? 
     if (Mouse.Captured != null) 
     { 

      FrameworkElement movingClass = (FrameworkElement)e.MouseDevice.Target; 

      Node movingNode = (Node)movingClass.DataContext; 

      Canvas canvas = FindParent<Canvas>(movingClass); 
      Point mousePosition = Mouse.GetPosition(canvas); 
      if (moveNodePoint == default(Point)) moveNodePoint = mousePosition; 
      movingNode.X = (int)mousePosition.X; 
      movingNode.Y = (int)mousePosition.Y; 
     } 
    } 

    public void MouseUpNode(MouseEventArgs e) 
    { 
     //Used to move node 
     FrameworkElement movingClass = (FrameworkElement)e.MouseDevice.Target; 
     Node movingNode = (Node)movingClass.DataContext; 
     Canvas canvas = FindParent<Canvas>(movingClass); 
     Point mousePosition = Mouse.GetPosition(canvas); 
      new MoveNodeCommand(movingNode, (int)mousePosition.X, (int)mousePosition.Y,  (int)moveNodePoint.X, (int)moveNodePoint.Y); 
     moveNodePoint = new Point(); 
     e.MouseDevice.Target.ReleaseMouseCapture(); 
    } 

И XAML для некоторых из UserControl:

<DockPanel.Background> 
      <LinearGradientBrush StartPoint="0,0" EndPoint="1,0.0"> 
       <LinearGradientBrush.GradientStops> 
        <GradientStop Color="Azure" Offset="0"/> 
        <GradientStop Color="Transparent" Offset="1"/> 
       </LinearGradientBrush.GradientStops> 
      </LinearGradientBrush> 
     </DockPanel.Background> 
     <TextBox Text="{Binding ClassName}" HorizontalAlignment="Center"  DockPanel.Dock="Top" Margin="5,0,5,0"/> 

     <!--Note the " : " is acutally being written to the GUI--> 
     <ItemsControl Name="attributeList" ItemsSource="{Binding Attributes}" Margin="5,0,5,0" DockPanel.Dock="Top"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock><Run Text="{Binding Path=.}"/> : <Run Text="Type her"/></TextBlock> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

     <ItemsControl Name="propertiesList" ItemsSource="{Binding Properties}" Margin="5,0,5,0" DockPanel.Dock="Top"> 
     </ItemsControl> 

     <ItemsControl Name="methodsList" ItemsSource="{Binding Methods}" Margin="5,0,5,0" DockPanel.Dock="Top"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock><Run Text="{Binding Path=.}"/>() : <Run Text="Type her"/></TextBlock> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

    </DockPanel> 

Я бы тоже хотел узнать, есть ли более умный или лучший способ сделать это.

ответ

1

Добавить IsHitTestVisible="False" в ItemsControl.

+0

Спасибо человеку. Однако в будущем мне, возможно, придется удвоить их. Но пока не уверен в этом. Но спасибо! –