2011-04-12 80 views
2

我希望能够在我的应用程序拖放到能够创造部件之间的连接。这听起来不太难,但问题是我想要连接的组件类型。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构成的轨道组成。

canvas in action

所以我要连接的部件(或节点)都TrackSections,所以想要拖放(使用右mousebutton)一个部分到另一部分,这应该调用一个方法(命令)在我的DocumentViewModel(视图模型保存在画布上的项目),而不是在部分,因为部分没有关于其他组件的线索,也不应该保持连接。

的目标是创建连接(含有从和到部件),其应该能够ontop的一切,因为线的要渲染的一个列表中,使用装饰层或类似的)。我还可以补充说,可以用来创建连接的组件都实现了一个INode接口,以便能够识别它们。

我希望我描述了我的问题和情况不够清楚。我可以补充,我已经找到了很多关于拖曳&落下好职位,但我没能到其中的任何应用到我的情况,这就是为什么我问这里。

+0

顺便说一句,没有必要使用ImageShack的; SO有一个imgur的特殊账户可以处理惩罚。下次使用编辑器中的图像链接上传图像。 (另外,编辑你的问题来解决这个问题会碰到它) – Will 2011-04-12 13:29:44

+0

感谢有关凹凸的信息。起初由于我的声望不够高,我无法上传图片。 – chiefi 2011-04-13 09:02:19

+0

这是对“纯”MVVM的要求放宽可以为您节省大量头痛的情况之一。您可以为ListBox编写各种预览鼠标事件处理程序,然后将鼠标事件转换为对ViewModel的调用。这意味着你会有一些代码隐藏,但它给你很大的灵活性来决定如何解释UI交互。为了最好地维护'MVVMness',尽量减少代码粘合到代码中,这些代码将特定的鼠标行为映射到ViewModel上的有意义的动作。 – 2012-09-21 19:05:08

回答

0

是不是要在画布上首位组件,然后从一个组件拖动到另一个创建它们之间的连接?现在你的问题与拖动&下降?为什么你认为组件的类型是一个问题?

我只是想什么ü真正想要的,但也许是下面的方法可能会奏效:

  • 上右击确定组件和tracksection您的鼠标悬停
  • 就拖
  • 确定是否正在徘徊的另一个组件这允许丢弃(给予视觉线索)
  • 如果滴允许检查u的盘旋
  • 创建tracksections的连接的tracksection

这里有一个Drag&Drop-Framwork的链接。

最好的问候, toolsche