我希望能够在我的应用程序拖放到能够创造部件之间的连接。这听起来不太难,但问题是我想要连接的组件类型。C#WPF拖放的ListBox MVVM
我希望能够建立连接的原因是为了能够使图形和计算最短路径等
我所拥有的是组件列表框被放置在画布上。我使用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>
虽然现在棘手的是,它是不是这些组件中在我的视图模型组件我想使用拖放,但组件。为了更好地说明这一点,请参阅下面的火车站和轨道的示例图片。我有PlaceableComponents(它们是列表框中的那些),即轨道和站。轨道由轨道段组成,轨道段可以是常规轨道段和电气化轨道段)。一个站是由平台组成的,平台由TrackSections构成的轨道组成。
所以我要连接的部件(或节点)都TrackSections,所以想要拖放(使用右mousebutton)一个部分到另一部分,这应该调用一个方法(命令)在我的DocumentViewModel(视图模型保存在画布上的项目),而不是在部分,因为部分没有关于其他组件的线索,也不应该保持连接。
的目标是创建连接(含有从和到部件),其应该能够ontop的一切,因为线的要渲染的一个列表中,使用装饰层或类似的)。我还可以补充说,可以用来创建连接的组件都实现了一个INode接口,以便能够识别它们。
我希望我描述了我的问题和情况不够清楚。我可以补充,我已经找到了很多关于拖曳&落下好职位,但我没能到其中的任何应用到我的情况,这就是为什么我问这里。
顺便说一句,没有必要使用ImageShack的; SO有一个imgur的特殊账户可以处理惩罚。下次使用编辑器中的图像链接上传图像。 (另外,编辑你的问题来解决这个问题会碰到它) – Will 2011-04-12 13:29:44
感谢有关凹凸的信息。起初由于我的声望不够高,我无法上传图片。 – chiefi 2011-04-13 09:02:19
这是对“纯”MVVM的要求放宽可以为您节省大量头痛的情况之一。您可以为ListBox编写各种预览鼠标事件处理程序,然后将鼠标事件转换为对ViewModel的调用。这意味着你会有一些代码隐藏,但它给你很大的灵活性来决定如何解释UI交互。为了最好地维护'MVVMness',尽量减少代码粘合到代码中,这些代码将特定的鼠标行为映射到ViewModel上的有意义的动作。 – 2012-09-21 19:05:08