2017-05-06 40 views
0

我在它们之间绘制了画布和线条上的两个椭圆。当窗口高度改变时,线开始在Y坐标中移动。如何让线路停留在一个地方或移动椭圆线?如何让线留在帆布上的一个位置?

<Window x:Class="LineEllipse.MainWindow" 
    Title="MainWindow" Height="768" Width="1366" WindowState="Maximized" SizeChanged="Window_SizeChanged"> 

<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 
<Grid> 
    <ItemsControl> 
     <ItemsControl.Resources> 
      <CollectionViewSource x:Key="Ellipses" Source="{Binding Ellipses}"/> 
      <CollectionViewSource x:Key="Lines" Source="{Binding Lines}"/> 
      <DataTemplate DataType="{x:Type local:BlackEllipse}"> 
       <Ellipse Width="26" Height="26" Fill="Black"/> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type local:RedLine}"> 
       <Line X1="{Binding X1}" X2="{Binding X2}" Y1="{Binding Y1}" Y2="{Binding Y2}" Stroke="Red" StrokeThickness="4"/> 
      </DataTemplate> 
     </ItemsControl.Resources> 
     <ItemsControl.ItemsSource> 
      <CompositeCollection> 
       <CollectionContainer Collection="{Binding Source={StaticResource Ellipses}}"/> 
       <CollectionContainer Collection="{Binding Source={StaticResource Lines}}"/> 
      </CompositeCollection> 
     </ItemsControl.ItemsSource> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemContainerStyle> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding CanvasLeft}"/> 
       <Setter Property="Canvas.Bottom" Value="{Binding CanvasBottom}"/> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
    </ItemsControl> 
</Grid> 

视图模型

public class ViewModel 
{ 
    public ObservableCollection<BlackEllipse> Ellipses { get; set; } 
    public ObservableCollection<RedLine> Lines { get; set; } 

    public ViewModel() 
    { 
     Ellipses = new ObservableCollection<BlackEllipse>() 
     { 
      new BlackEllipse() { CanvasLeft = 1000, CanvasBottom = 650 }, 
      new BlackEllipse() { CanvasLeft = 900, CanvasBottom = 650 } 
     }; 

     Lines = new ObservableCollection<RedLine>() 
     { 
      new RedLine { X1 = 1013, X2 = 913, Y1 = 768 - 75 - 650, Y2 = 768 - 75 - 650 } 
     }; 
    } 
} 

public class BlackEllipse : INotifyPropertyChanged 
{ 
    private double canvasLeft; 
    private double canvasBottom; 

    public double CanvasLeft 
    { 
     get { return canvasLeft; } 
     set 
     { 
      canvasLeft = value; 
      OnPropertyChanged("CanvasLeft"); 
     } 
    } 

    public double CanvasBottom 
    { 
     get { return canvasBottom; } 
     set 
     { 
      canvasBottom = value; 
      OnPropertyChanged("CanvasBottom"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName]string prop = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop)); 
    } 
} 

public class RedLine 
{ 
    public int X1 { get; set; } 
    public int Y1 { get; set; } 

    public int X2 { get; set; } 
    public int Y2 { get; set; } 
} 
+0

看看[此更通用的方法(http://stackoverflow.com/a/40190793/1136211)。您可以将其与LineGeometry一起使用。 – Clemens

回答

1

您已经定义Canvas.Left,Canvas.Bottom附加属性的省略号。如果要使线条与椭圆一起移动,还必须为线条定义它们。

public class RedLine 
{ 
    public double CanvasLeft { get; set; } 
    public double CanvasBottom { get; set; } 
    public int X1 { get; set; } 
    public int Y1 { get; set; } 

    public int X2 { get; set; } 
    public int Y2 { get; set; } 
} 

初始化...

Lines = new ObservableCollection<RedLine>() 
    { 
     new RedLine { CanvasLeft = 0, CanvasBottom = 650, X1 = 1013, X2 = 913, Y1 = 768 - 75 - 650, Y2 = 768 - 75 - 650 } 
    }; 
+0

谢谢我已经这样做了)我认为还有一种方法可以通过xy坐标变化来移动它。 –