0

だから、私の問題は、キャンバス内でいくつかのユーザーコントロールを移動しようとしていることです。

これは、マウスポインターがドックパネル内にある限り、実際には非常にうまく機能します。これは、ユーザーコントロールが構成されているものです。ただし、ドックパネル内にはいくつかの項目コントロールがあり、それらをクリックして移動しようとすると、「タイプ「System.String」のオブジェクトをタイプ「UMLDesigner.Model」にキャストできませんというような例外が生成されます.Node". これは理にかなっていますが、アイテム コントロールがクリックされたとしても、アイテム コントロールの代わりに DockPanel を取得する方法はありますか?

関連する 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>

もちろん、これを行うためのよりスマートな方法やより良い方法があるかどうかも知りたいです。

4

1 に答える 1

1

IsHitTestVisible="False"ItemsControlに追加します。

于 2013-10-11T18:24:46.137 に答える