Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF阻力和阻力;下拉列表框MVVM_C#_Wpf_Mvvm_Drag And Drop_Listbox - Fatal编程技术网

C#WPF阻力和阻力;下拉列表框MVVM

C#WPF阻力和阻力;下拉列表框MVVM,c#,wpf,mvvm,drag-and-drop,listbox,C#,Wpf,Mvvm,Drag And Drop,Listbox,我希望在我的应用程序中启用拖放功能,以便能够在组件之间创建连接。这听起来不太难,但问题是我想要连接的组件类型 我希望能够建立连接的原因是能够制作一个图表和计算最短路径,等等 我拥有的是一个列表框,其中包含放置在画布上的组件。我使用ListBox的原因是使组件可以选择。我还把它们做成了拖拉的 <DataTemplate DataType="{x:Type ViewModels:DocumentViewModel}"> <DataTemplate.Resources>

我希望在我的应用程序中启用拖放功能,以便能够在组件之间创建连接。这听起来不太难,但问题是我想要连接的组件类型

我希望能够建立连接的原因是能够制作一个图表和计算最短路径,等等

我拥有的是一个列表框,其中包含放置在画布上的组件。我使用ListBox的原因是使组件可以选择。我还把它们做成了拖拉的

<DataTemplate DataType="{x:Type ViewModels:DocumentViewModel}">
    <DataTemplate.Resources>
        <Converters:GuiSizeConverter x:Key="SizeConverter"/>
    </DataTemplate.Resources>
    <ListBox ItemsSource="{Binding Components}" SelectedItem="{Binding SelectedItem}" Background="Transparent" 
             HorizontalAlignment="Left" VerticalAlignment="Top" BorderThickness="0" Margin="0">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas ClipToBounds="True" Height="{Binding CurrentProject.Height, Converter={StaticResource SizeConverter}}"
                        Width="{Binding CurrentProject.Width, Converter={StaticResource SizeConverter}}">
                    <Canvas.Background>
                        <SolidColorBrush Color="{DynamicResource {x:Static SystemColors.WindowFrameColorKey}}"/>
                    </Canvas.Background>
                </Canvas>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Grid>
                                <Border Background="{TemplateBinding Background}" />
                                <ContentPresenter/>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsMouseOver" Value="True" />
                                        <Condition Property="IsSelected" Value="False"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Background" Value="#8868D5FD" />
                                </MultiTrigger>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="#4468D5FD" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="Utils:DraggableExtender.CanDrag" Value="True" />
                <Setter Property="Canvas.Top" Value="{Binding Path=Y, Converter={StaticResource SizeConverter},Mode=TwoWay}" />
                <Setter Property="Canvas.Left" Value="{Binding Path=X, Converter={StaticResource SizeConverter},Mode=TwoWay}" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
</DataTemplate>

但现在棘手的事情是,我要使用拖放操作的不是ViewModel中的组件,而是这些组件中的组件。为了更好地说明这一点,请参见下面的火车站和轨道示例图片。我有可放置组件(即列表框中的组件),即轨道和车站。轨道由轨道区段组成,轨道区段可以是常规轨道区段和电气化轨道区段)。车站由站台组成,站台由轨道组成,轨道由轨道段组成

所以我想连接的组件(或节点)是TrackSections,所以我想(使用鼠标右键)将一个节拖放到另一个节上,这应该调用DocumentViewModel(画布上保存项目的viewmodel)中的方法(命令)而不是在区段上,因为区段没有关于其他组件的线索,它们也不应该保持连接

目标是创建一个连接列表(包含“从”和“到”组件),该列表应能够使用装饰层或类似工具在所有对象的顶部渲染为线。我还可以补充一点,可以用来创建连接的组件都实现了一个INode接口,以便能够识别它们


我希望我把我的问题和情况描述得足够清楚。我可以补充一点,我已经找到了很多关于拖放的好文章,但我无法将其中任何一篇应用到我的案例中,这就是我在这里提问的原因。

您是否希望首先将组件放置在画布上,然后通过从一个组件拖动到另一个组件来创建它们之间的连接?现在您的拖放有什么问题?为什么您认为组件的类型是一个问题

我只能猜测您真正想要什么,但以下方法可能会奏效:

  • 单击鼠标右键,确定组件和鼠标悬停的轨迹部分
  • 在拖动中,确定您是否将鼠标悬停在另一个允许放置的组件上(给出视觉提示)
  • 如果允许放置,请检查您悬停的轨迹部分
  • 创建轨道区段的连接

这里是指向的链接。

您是否希望首先将组件放置在画布上,然后通过从一个组件拖动到另一个组件来创建它们之间的连接?现在您的拖放有什么问题?为什么您认为组件的类型是一个问题

我只能猜测您真正想要什么,但以下方法可能会奏效:

  • 单击鼠标右键,确定组件和鼠标悬停的轨迹部分
  • 在拖动中,确定您是否将鼠标悬停在另一个允许放置的组件上(给出视觉提示)
  • 如果允许放置,请检查您悬停的轨迹部分
  • 创建轨道区段的连接

这里有一个到a的链接。

顺便说一句,不需要使用imageshack;因此,在imgur有一个专门的账户,可以处理处罚。下次使用编辑器中的图像链接上载图像。(另外,编辑您的问题以修复此问题将导致碰撞)感谢您提供有关碰撞的信息。一开始我无法上传图像,因为我没有足够高的声誉。这是放宽对“纯”MVVM的要求可以帮你省去很多麻烦的情况之一。您可以为ListBox编写各种预览鼠标事件处理程序,然后将鼠标事件转换为对ViewModel的调用。这意味着您将有一些代码落后,但它为您提供了很大的灵活性来决定如何解释UI交互。为了最好地维护“MVVMness”,尽量减少将特定鼠标行为映射为ViewModel上有意义的操作的粘合代码的代码。顺便说一句,无需使用imageshack;因此,在imgur有一个专门的账户,可以处理处罚。下次使用编辑器中的图像链接上载图像。(另外,编辑您的问题以修复此问题将导致碰撞)感谢您提供有关碰撞的信息。一开始我无法上传图像,因为我没有足够高的声誉。这是放宽对“纯”MVVM的要求可以帮你省去很多麻烦的情况之一。您可以为ListBox编写各种预览鼠标事件处理程序,然后将鼠标事件转换为对ViewModel的调用。这意味着您将有一些代码,但它为您提供了很大的灵活性来决定如何解释