2009-11-02 3 views
1

일부 데이터를 나타내는 표가 있으며 일부 선을 배치하기 위해 캔버스가 오버레이되도록해야합니다. 캔버스 자체가 사용자 정의 컨트롤 안에 있음WPF 및 캔버스 오버레이

그리드가 너비와 높이의 크기를 조정할 때 캔버스와 그 내용이 자동 크기 조정되어야하는 문제가 있습니다.

뷰 박스 안에 캔버스를 추가했지만 트릭을하지 않았습니다. 모눈의 크기를 조정하면 캔버스가 조정되지 않습니다. 캔버스의 목적은 눈금자와 같은 기능을 눈금 위에 중첩시키는 것입니다.

그리드가 캔버스와 다른 정보를 표시하기 때문에 그리드의 스타일을 사용하여 캔버스를 대체 할 수 없습니다.

taxCanvas = new TimeAxis(); 
Grid.SetRowSpan(taxCanvas, GRightMain.RowDefinitions.Count); 
Grid.SetColumnSpan(taxCanvas, GRightMain.ColumnDefinitions.Count); 
Grid.SetColumn(taxCanvas, 0); Grid.SetRow(taxCanvas, 0); 
Grid.SetZIndex(taxCanvas, -1); 
taxCanvas.Height = GRight.ActualHeight; 
taxCanvas.Width = GRight.ActualWidth; 
GRightMain.Children.Add(taxCanvas); 
:있는가 (내 경우에는 그리드) 다른 크기의 바 열이 있고 일 (단지 Gannt 차트 등) 오버레이 라인

내 코드입니다, 차트이라고 생각

TimeAxis는 내 캔버스 usercontrol입니다. GRightMain은 동일한 행과 열에 내용 (Gright)이있는 내 캔버스와 그리드를 모두 포함하는 그리드입니다.

답변

0

귀하의 GRightMail 컨트롤은 기본적으로 내용이 늘어나는 그리드입니다. 데이터와 TimeAxis 컨트롤이 모두 동일한 그리드 셀 (및 동일한 행/열 범위)에 있으면 함께 스트레칭해야합니다.

그래도 문제가 해결되지 않으면 TimeAxis의 너비 또는 높이가 고정되어 있지 않은지 또는 수평/수직 정렬이 정의되어 있지 않은지 확인하십시오.

1

문제의 직접적인 원인은 라인입니다 :

taxCanvas.Height = GRight.ActualHeight; 
taxCanvas.Width = GRight.ActualWidth; 

이는 자동 크기 조정을 사용하지 않도록, 당신의 TimeAxis 제어를위한 고정 된 크기를 설정합니다.

TimeAxis 사용자 정의 컨트롤에 측정에 영향을주는 내부 설정이 없다고 가정하면 높이 및 너비 설정을 다음으로 바꾸면 UserControl의 크기가 자동으로 조정됩니다.

taxCanvas.HorizontalAlignment = HorizontalAlignment.Stretch; 
taxCanvas.VerticalAlignment = VerticalAlignment.Stretch; 

이 방법으로는 문제가 완전히 해결되지 않을 수 있습니다. UserControl의 원하는 크기와 레이아웃 크기는 그리드의 크기와 동일하지만 여전히 캔버스에서 개체의 크기를 수동으로 조정해야합니다. Canvas에는 측정/정렬에 대한 규정이 없으므로 코드로이를 처리해야합니다. 일반적인 기술은 다음과 같습니다.

  1. 이미 시도한 ViewBox 안에 캔버스를 래핑합니다. 위 라인이 변경되면 다시 시도 할 수 있습니다.
  2. 코드 또는 바인딩을 사용하여 캔버스으로 RenderTransform 조정 (LayoutTransform을 조정하는 것보다 더 효율적, 그리고 캔버스 어쨌든 레이아웃에 참여하지 않음)

하나 개 잡았다에 코드 또는 바인딩을 사용하여 개별 모양의 위치를 ​​조정

  • 을 주의 사항 : 캔버스 크기를 조정하면 내용에 영향을주지 않습니다. 따라서 캔버스가 실제로 크기가 조정되는지 여부를 알고 싶다면 배경색을 지정하십시오. 그렇게하면 사이징 문제에 대한 잘못된 곳을 찾는 데 시간을 낭비하지 않아도됩니다.