2013-10-11 74 views
0

所以,我的问题是我试图在画布中移动一些usercontrols。在WPF中Mousemoving Usercontrol WPF

这实际上工作得很好,只要鼠标指针位于dockpanel内,这是usercontrol的组成部分。但是,在dockpanel中,有几个itemscontrols,如果我点击这些,并尝试移动它,会产生一个异常,说明类似于“无法强制转换类型为”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:

<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

谢谢你。但是,在将来我可能需要能够双击它们......虽然还不确定。但是,谢谢! –