连接点显示

This commit is contained in:
艾竹
2023-05-02 14:28:51 +08:00
parent f52895a8a8
commit 06c3ddde7e
11 changed files with 93 additions and 4325 deletions

View File

@@ -37,11 +37,37 @@ namespace AIStudio.Wpf.DiagramDesigner
return DiagramServicesProvider.Instance.Provider; return DiagramServicesProvider.Instance.Provider;
} }
} }
private ConnectionViewModel partialConnection; private ConnectionViewModel partialConnection;
private List<Connector> connectorsHit = new List<Connector>();
private Point? rubberbandSelectionStartPoint = null; private Point? rubberbandSelectionStartPoint = null;
private Connector sourceConnector;
public Connector SourceConnector
{
get
{
return sourceConnector;
}
set
{
if (sourceConnector != value)
{
sourceConnector = value;
FullyCreatedConnectorInfo sourceDataItem = sourceConnector.Info;
Rect rectangleBounds = sourceConnector.TransformToVisual(this).TransformBounds(new Rect(sourceConnector.RenderSize));
Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2),
rectangleBounds.Bottom + (rectangleBounds.Height / 2));
partialConnection = new ConnectionViewModel(_viewModel, sourceDataItem, new PartCreatedConnectorInfo(point.X, point.Y), DrawMode, RouterMode);
_viewModel.Add(partialConnection);
}
}
}
private Connector sinkConnector;
private DrawMode DrawMode private DrawMode DrawMode
{ {
get get
@@ -100,7 +126,7 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
} }
#region GridCellSize #region GridCellSize
public static readonly DependencyProperty GridCellSizeProperty = public static readonly DependencyProperty GridCellSizeProperty =
@@ -293,32 +319,6 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
#endregion #endregion
private Connector sourceConnector;
public Connector SourceConnector
{
get
{
return sourceConnector;
}
set
{
if (sourceConnector != value)
{
sourceConnector = value;
connectorsHit.Add(sourceConnector);
FullyCreatedConnectorInfo sourceDataItem = sourceConnector.Info;
Rect rectangleBounds = sourceConnector.TransformToVisual(this).TransformBounds(new Rect(sourceConnector.RenderSize));
Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2),
rectangleBounds.Bottom + (rectangleBounds.Height / 2));
partialConnection = new ConnectionViewModel(_viewModel, sourceDataItem, new PartCreatedConnectorInfo(point.X, point.Y), DrawMode, RouterMode);
_viewModel.Add(partialConnection);
}
}
}
protected override void OnMouseDown(MouseButtonEventArgs e) protected override void OnMouseDown(MouseButtonEventArgs e)
{ {
base.OnMouseDown(e); base.OnMouseDown(e);
@@ -376,6 +376,7 @@ namespace AIStudio.Wpf.DiagramDesigner
var point = CursorPointManager.GetCursorPosition(); var point = CursorPointManager.GetCursorPosition();
_viewModel.CurrentColor = ColorPickerManager.GetColor(point.X, point.Y); _viewModel.CurrentColor = ColorPickerManager.GetColor(point.X, point.Y);
//移动
if (_service.DrawModeViewModel.CursorMode == CursorMode.Move) if (_service.DrawModeViewModel.CursorMode == CursorMode.Move)
{ {
_viewModel.SelectedItems.OfType<DesignerItemViewModelBase>().ToList().ForEach(p => { _viewModel.SelectedItems.OfType<DesignerItemViewModelBase>().ToList().ForEach(p => {
@@ -390,7 +391,7 @@ namespace AIStudio.Wpf.DiagramDesigner
if (e.LeftButton == MouseButtonState.Pressed) if (e.LeftButton == MouseButtonState.Pressed)
{ {
partialConnection.SinkConnectorInfo = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y); partialConnection.SinkConnectorInfo = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y);
HitTesting(currentPoint); sinkConnector = HitTesting(currentPoint);
if (EnableSnapping) if (EnableSnapping)
{ {
@@ -405,7 +406,7 @@ namespace AIStudio.Wpf.DiagramDesigner
else else
{ {
// if mouse button is not pressed we have no drag operation, ... // if mouse button is not pressed we have no drag operation, ...
if (e.LeftButton != MouseButtonState.Pressed && _service.DrawModeViewModel.GetDrawMode() != DrawMode.DirectLine) if (e.LeftButton != MouseButtonState.Pressed)
rubberbandSelectionStartPoint = null; rubberbandSelectionStartPoint = null;
// ... but if mouse button is pressed and start // ... but if mouse button is pressed and start
@@ -439,9 +440,9 @@ namespace AIStudio.Wpf.DiagramDesigner
if (sourceConnector != null) if (sourceConnector != null)
{ {
FullyCreatedConnectorInfo sourceDataItem = sourceConnector.Info; FullyCreatedConnectorInfo sourceDataItem = sourceConnector.Info;
if (connectorsHit.Count() == 2) if (sinkConnector != null)
{ {
Connector sinkConnector = connectorsHit.Last();
FullyCreatedConnectorInfo sinkDataItem = sinkConnector.Info; FullyCreatedConnectorInfo sinkDataItem = sinkConnector.Info;
int indexOfLastTempConnection = sinkDataItem.DataItem.Root.Items.Count - 1; int indexOfLastTempConnection = sinkDataItem.DataItem.Root.Items.Count - 1;
@@ -459,13 +460,11 @@ namespace AIStudio.Wpf.DiagramDesigner
int indexOfLastTempConnection = sourceDataItem.DataItem.Root.Items.Count - 1; int indexOfLastTempConnection = sourceDataItem.DataItem.Root.Items.Count - 1;
sourceDataItem.DataItem.Root.Remove( sourceDataItem.DataItem.Root.Remove(
sourceDataItem.DataItem.Root.Items[indexOfLastTempConnection]); sourceDataItem.DataItem.Root.Items[indexOfLastTempConnection]);
} }
} }
connectorsHit = new List<Connector>();
sourceConnector = null; sourceConnector = null;
sinkConnector = null;
if (_service.DrawModeViewModel.GetDrawMode() != DrawMode.DirectLine) if (_service.DrawModeViewModel.GetDrawMode() != DrawMode.DirectLine)
{ {
@@ -526,7 +525,7 @@ namespace AIStudio.Wpf.DiagramDesigner
return size; return size;
} }
private void HitTesting(Point hitPoint) private Connector HitTesting(Point hitPoint)
{ {
DependencyObject hitObject = this.InputHitTest(hitPoint) as DependencyObject; DependencyObject hitObject = this.InputHitTest(hitPoint) as DependencyObject;
while (hitObject != null && while (hitObject != null &&
@@ -534,11 +533,12 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
if (hitObject is Connector connector) if (hitObject is Connector connector)
{ {
if (!connectorsHit.Contains(hitObject as Connector)) return connector;
connectorsHit.Add(hitObject as Connector);
} }
hitObject = VisualTreeHelper.GetParent(hitObject); hitObject = VisualTreeHelper.GetParent(hitObject);
} }
return null;
} }
protected override void OnDrop(DragEventArgs e) protected override void OnDrop(DragEventArgs e)

View File

@@ -7,7 +7,7 @@
<dd:ConectorValueConverter x:Key="ConectorValueConverter"/> <dd:ConectorValueConverter x:Key="ConectorValueConverter"/>
<DataTemplate DataType="{x:Type dd:FullyCreatedConnectorInfo}"> <DataTemplate DataType="{x:Type dd:FullyCreatedConnectorInfo}">
<Grid Width="{Binding ConnectorWidth}" Height="{Binding ConnectorHeight}"> <Grid Width="{Binding ConnectorWidth}" Height="{Binding ConnectorHeight}" Cursor="Cross">
<Grid.ContextMenu> <Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding MenuOptions}" > <ContextMenu ItemsSource="{Binding MenuOptions}" >
<ContextMenu.ItemContainerStyle> <ContextMenu.ItemContainerStyle>
@@ -24,14 +24,22 @@
</ContextMenu> </ContextMenu>
</Grid.ContextMenu> </Grid.ContextMenu>
<!-- transparent extra space makes connector easier to hit --> <!-- transparent extra space makes connector easier to hit -->
<Rectangle Fill="Transparent" Margin="-2" /> <Ellipse x:Name="outer" Fill="Transparent" Opacity="0.3" Margin="-3" />
<Rectangle Fill="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}" StrokeThickness="1" Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" /> <Ellipse x:Name="innter" Fill="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}" StrokeThickness="1" Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" />
</Grid> </Grid>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outer" Property="Margin" Value="-6" />
<Setter TargetName="outer" Property="Fill" Value="#f73438" />
<Setter TargetName="innter" Property="Fill" Value="#f73438" />
<Setter TargetName="innter" Property="Stroke" Value="#f73438" />
</Trigger>
</DataTemplate.Triggers>
</DataTemplate> </DataTemplate>
<DataTemplate DataType="{x:Type dd:LogicalConnectorInfo}"> <DataTemplate DataType="{x:Type dd:LogicalConnectorInfo}">
<Grid > <Grid >
<Grid ToolTip="{Binding Name}" Width="{Binding ConnectorWidth}" Height="{Binding ConnectorHeight}" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid ToolTip="{Binding Name}" Width="{Binding ConnectorWidth}" Height="{Binding ConnectorHeight}" HorizontalAlignment="Left" VerticalAlignment="Top" Cursor="Cross">
<Grid.ContextMenu> <Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding MenuOptions}"> <ContextMenu ItemsSource="{Binding MenuOptions}">
<ContextMenu.ItemContainerStyle> <ContextMenu.ItemContainerStyle>
@@ -48,8 +56,8 @@
</ContextMenu> </ContextMenu>
</Grid.ContextMenu> </Grid.ContextMenu>
<!-- transparent extra space makes connector easier to hit --> <!-- transparent extra space makes connector easier to hit -->
<Rectangle Fill="Transparent" Margin="-2" /> <Ellipse x:Name="outer" Fill="Transparent" Opacity="0.3" Margin="-3" />
<Rectangle Fill="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}" StrokeThickness="1" Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" /> <Ellipse x:Name="innter" Fill="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}" StrokeThickness="1" Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" />
</Grid> </Grid>
<Control x:Name="label"> <Control x:Name="label">
@@ -83,6 +91,12 @@
</Grid> </Grid>
<DataTemplate.Triggers> <DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outer" Property="Margin" Value="-6" />
<Setter TargetName="outer" Property="Fill" Value="#f73438" />
<Setter TargetName="innter" Property="Fill" Value="#f73438" />
<Setter TargetName="innter" Property="Stroke" Value="#f73438" />
</Trigger>
<DataTrigger Value="Right" Binding="{Binding Orientation}"> <DataTrigger Value="Right" Binding="{Binding Orientation}">
<Setter TargetName="label" Property="Template"> <Setter TargetName="label" Property="Template">
<Setter.Value> <Setter.Value>

View File

@@ -203,7 +203,6 @@
<Grid Margin="{Binding ConnectorMargin}"> <Grid Margin="{Binding ConnectorMargin}">
<dd:Connector <dd:Connector
Content="{Binding LeftConnector}" Content="{Binding LeftConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="Left" Orientation="Left"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -211,7 +210,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding TopLeftConnector}" Content="{Binding TopLeftConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="TopLeft" Orientation="TopLeft"
VerticalAlignment="Top" VerticalAlignment="Top"
@@ -219,7 +217,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding TopConnector}" Content="{Binding TopConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="Top" Orientation="Top"
VerticalAlignment="Top" VerticalAlignment="Top"
@@ -227,7 +224,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding TopRightConnector}" Content="{Binding TopRightConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="TopRight" Orientation="TopRight"
VerticalAlignment="Top" VerticalAlignment="Top"
@@ -235,7 +231,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding RightConnector}" Content="{Binding RightConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="Right" Orientation="Right"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -243,7 +238,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding BottomRightConnector}" Content="{Binding BottomRightConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="BottomRight" Orientation="BottomRight"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
@@ -251,7 +245,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding BottomConnector}" Content="{Binding BottomConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="Bottom" Orientation="Bottom"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
@@ -259,7 +252,6 @@
Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" /> Visibility="{Binding Path=ShowConnectors, Converter={x:Static dd:BoolToVisibilityConverter.Instance}}" />
<dd:Connector <dd:Connector
Content="{Binding BottomLeftConnector}" Content="{Binding BottomLeftConnector}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
Orientation="BottomLeft" Orientation="BottomLeft"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
@@ -300,7 +292,6 @@
<Grid> <Grid>
<dd:Connector <dd:Connector
Content="{Binding .}" Content="{Binding .}"
Cursor="Cross"
SnapsToDevicePixels="True"/> SnapsToDevicePixels="True"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
@@ -633,7 +624,7 @@
<dd:ConnectorContainer x:Name="PART_ConnectorContainer" Visibility="Hidden" Style="{StaticResource GifImageConnectorContainer}" ItemsSource="{Binding Connectors}"> <dd:ConnectorContainer x:Name="PART_ConnectorContainer" Visibility="Hidden" Style="{StaticResource GifImageConnectorContainer}" ItemsSource="{Binding Connectors}">
<dd:ConnectorContainer.ItemTemplate> <dd:ConnectorContainer.ItemTemplate>
<DataTemplate> <DataTemplate>
<dd:Connector Content="{Binding .}" Cursor="Cross" SnapsToDevicePixels="True"/> <dd:Connector Content="{Binding .}" SnapsToDevicePixels="True"/>
</DataTemplate> </DataTemplate>
</dd:ConnectorContainer.ItemTemplate> </dd:ConnectorContainer.ItemTemplate>
</dd:ConnectorContainer> </dd:ConnectorContainer>
@@ -708,7 +699,7 @@
<dd:ConnectorContainer.ItemTemplate> <dd:ConnectorContainer.ItemTemplate>
<DataTemplate> <DataTemplate>
<Grid> <Grid>
<dd:Connector Content="{Binding .}" Cursor="Cross" SnapsToDevicePixels="True"/> <dd:Connector Content="{Binding .}" SnapsToDevicePixels="True"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</dd:ConnectorContainer.ItemTemplate> </dd:ConnectorContainer.ItemTemplate>
@@ -814,8 +805,7 @@
<!-- PART_ConnectorDecorator --> <!-- PART_ConnectorDecorator -->
<Grid Margin="-5" <Grid Margin="-5"
x:Name="PART_ConnectorDecorator"> x:Name="PART_ConnectorDecorator">
<dd:Connector Content="{Binding Connectors[0]}" <dd:Connector Content="{Binding Connectors[0]}"
Cursor="Cross"
SnapsToDevicePixels="True" SnapsToDevicePixels="True"
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Center" HorizontalAlignment="Center"

View File

@@ -13,31 +13,12 @@
<dd:ArrowSizeConverter x:Key="ArrowSizeConverter"/> <dd:ArrowSizeConverter x:Key="ArrowSizeConverter"/>
<dd:MathConverter x:Key="MathAddConverter" Operation="Add" /> <dd:MathConverter x:Key="MathAddConverter" Operation="Add" />
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<Style x:Key="LineStyle" TargetType="Path">
<Setter Property="Stroke" Value="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"/>
<Style.Triggers>
<DataTrigger Value="True" Binding="{Binding IsSelected}">
<Setter Property="Stroke" Value="Black"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="ArrowStyle" TargetType="Path">
<!--<Setter Property="Stroke" Value="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"/>-->
<Setter Property="Fill" Value="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"/>
<Style.Triggers>
<DataTrigger Value="True" Binding="{Binding IsSelected}">
<!--<Setter Property="Stroke" Value="Black"/>-->
<Setter Property="Fill" Value="Black"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources> </UserControl.Resources>
<Grid> <Grid>
<Canvas x:Name="rootCanvas"> <Canvas x:Name="rootCanvas">
<Path x:Name="line" StrokeThickness="{Binding ColorViewModel.LineWidth}" <Path x:Name="line" StrokeThickness="{Binding ColorViewModel.LineWidth}"
StrokeDashArray="{Binding ColorViewModel.LineDashStyle,Converter={StaticResource LineDashConverter}}" StrokeDashArray="{Binding ColorViewModel.LineDashStyle,Converter={StaticResource LineDashConverter}}"
Style="{StaticResource LineStyle}" Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"
StrokeLineJoin="Round" StrokeLineJoin="Round"
StrokeStartLineCap="Round" StrokeStartLineCap="Round"
StrokeEndLineCap="Round"> StrokeEndLineCap="Round">
@@ -60,7 +41,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Center" HorizontalAlignment="Center"
RenderTransformOrigin="0.5,0.5" RenderTransformOrigin="0.5,0.5"
Style="{StaticResource ArrowStyle}"> Fill="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}">
<Path.RenderTransform> <Path.RenderTransform>
<TransformGroup> <TransformGroup>
<RotateTransform Angle="{Binding EndAngle}"/> <RotateTransform Angle="{Binding EndAngle}"/>
@@ -81,7 +62,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Center" HorizontalAlignment="Center"
RenderTransformOrigin="0.5,0.5" RenderTransformOrigin="0.5,0.5"
Style="{StaticResource ArrowStyle}"> Fill="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}">
<Path.RenderTransform> <Path.RenderTransform>
<TransformGroup> <TransformGroup>
<RotateTransform Angle="{Binding StartAngle}"/> <RotateTransform Angle="{Binding StartAngle}"/>
@@ -90,19 +71,35 @@
</Path> </Path>
</Grid> </Grid>
<Rectangle Canvas.Left="{Binding StartPoint.X}" <Grid Canvas.Left="{Binding StartPoint.X}"
Canvas.Top="{Binding StartPoint.Y}" Canvas.Top="{Binding StartPoint.Y}"
Fill="DarkRed" Width="{Binding SourceConnectorInfo.ConnectorWidth}"
Width="{Binding SourceConnectorInfo.ConnectorWidth}" Height="{Binding SourceConnectorInfo.ConnectorHeight}"
Height="{Binding SourceConnectorInfo.ConnectorHeight}" UseLayoutRounding="True"
Visibility="{Binding IsSelected,Converter={StaticResource BooleanToVisibilityConverter}}" /> SnapsToDevicePixels="True"
Visibility="{Binding IsSelected,Converter={StaticResource BooleanToVisibilityConverter}}">
<Ellipse Stroke="DarkRed"
StrokeThickness="1"
Margin="-2.5"/>
<Rectangle
Fill="DarkRed"
Margin="1"/>
</Grid>
<Ellipse Canvas.Left="{Binding EndPoint.X}" <Grid Canvas.Left="{Binding EndPoint.X}"
Canvas.Top="{Binding EndPoint.Y}" Canvas.Top="{Binding EndPoint.Y}"
Fill="DarkRed" Width="{Binding SinkConnectorInfo.ConnectorWidth}"
Width="{Binding SinkConnectorInfo.ConnectorWidth}" Height="{Binding SinkConnectorInfo.ConnectorHeight}"
Height="{Binding SinkConnectorInfo.ConnectorHeight}" UseLayoutRounding="True"
Visibility="{Binding IsSelected,Converter={StaticResource BooleanToVisibilityConverter}}" /> SnapsToDevicePixels="True"
Visibility="{Binding IsSelected,Converter={StaticResource BooleanToVisibilityConverter}}">
<Ellipse Stroke="DarkRed"
StrokeThickness="1"
Margin="-2.5"/>
<Ellipse
Fill="DarkRed"
Margin="1"/>
</Grid>
<Path x:Name="ball" <Path x:Name="ball"
Stretch="Fill" Stretch="Fill"