C#WPF阻力和阻力;下拉列表框MVVM
我希望在我的应用程序中启用拖放功能,以便能够在组件之间创建连接。这听起来不太难,但问题是我想要连接的组件类型 我希望能够建立连接的原因是能够制作一个图表和计算最短路径,等等 我拥有的是一个列表框,其中包含放置在画布上的组件。我使用ListBox的原因是使组件可以选择。我还把它们做成了拖拉的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>
<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的调用。这意味着您将有一些代码,但它为您提供了很大的灵活性来决定如何解释