2010-05-19 8 views
0

나는 wpf를 처음 사용하며 사소한 문제 일 수 있습니다. 내가 치수로 계산 여러 라인 형상의 집합으로 구성 캔버스에 기하학을 그릴 싶습니다 때문에리소스 사전에서 사용자 정의 컨트롤을 위해 코드 뒤에서 복잡한 모양을 그리는 방법

<ResourceDictionary 
    x:Class="SyringeSlider.Themes.Generic" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SyringeSlider"> 
    <Style TargetType="{x:Type local:CustomControl1}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <Canvas Height="{TemplateBinding Height}" Width="{TemplateBinding Width}" Name="syringeCanvas"> 

         </Canvas> 
        </Border>     
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

불행하게도 나는이 넘어 갈 수 없습니다 리소스 사전에 다음과 같이 나는 사용자 지정 컨트롤을 정의 캔버스에서 사용할 수있는 공간의 함수입니다. 이렇게하려면 코드 숨김 메서드가 필요하지만 xaml 정의를 코드 숨김 메서드에 연결하는 방법을 결정할 수는 없습니다.

특별히이 목적을 위해 x : Class = "SyringeSlider.Themes.Generic"클래스를 설정했지만 어떤 Canvas 속성을 사용하여 드로잉 메서드를 연결할지 알 수 없습니다.

1) 내가 이해가해야 할 노력하고 무엇을합니까 :이

private void CalculateSyringe() 
     { 
      int adjHeight = (int) Height - 1; 
      int adjWidth = (int) Width - 1; 

      // Calculate some very useful values based on the chart above. 
      int borderOffset = (int)Math.Floor(m_borderWidth/2.0f); 
      int flangeLength = (int)(adjHeight * .05f); 

      int barrelLeftCol = (int)(adjWidth * .10f); 
      int barrelLength = (int)(adjHeight * .80); 
      int barrelRightCol = adjWidth - barrelLeftCol; 

      int coneLength = (int)(adjHeight * .10); 

      int tipLeftCol = (int)(adjWidth * .45); 
      int tipRightCol = adjWidth - tipLeftCol; 
      int tipBotCol = adjWidth - borderOffset; 

      Path mySyringePath = new Path(); 
      PathGeometry mySyringeGeometry = new PathGeometry(); 
      PathFigure mySyringeFigure = new PathFigure(); 
      mySyringeFigure.StartPoint = new Point(0, 0); 
      Point pointA = new Point(0, flangeLength); 
      mySyringeFigure.Segments.Add(new LineSegment(pointA, true)); 
      Point pointB = new Point(); 
      pointB.Y = pointA.Y + barrelLength; 
      pointB.X = 0; 
      mySyringeFigure.Segments.Add(new LineSegment(pointB, true)); 

      // You get the idea....Add more points in this way 

      mySyringeGeometry.Figures.Add(mySyringeFigure); 
      mySyringePath.Data = mySyringeGeometry; 

     } 

그래서 내 질문은 같은

내 그리기 방법이 보인다? 2)이 목적으로 캔버스를 사용할 수 있습니까? 그렇지 않다면 다른 옵션은 무엇입니까?

감사합니다.

답변

0

사용자 지정 컨트롤을 만들고 템플릿을 만들 때 컨트롤의 코드에서 OnApplyTemplate() 함수를 재정의하십시오. 템플릿 파트를 검색 한 다음 코드에서 참조를 가져와야합니다.

이와 비슷한 것.

public class MyControl : Control 
{ 
    private Canvas myCanvas; 

    public override void OnApplyTemplate() 
    { 
     Canvas theCanvas = Template.FindName("syringeCanvas", this) as Canvas; 

     if(theCanvas != null) 
     { 
      //<-- Save a reference to the canvas 
      myCanvas = theCanvas; 

      //<-- Do some stuff. 
     } 
    } 
} 

xaml에 캔버스의 이름을 지정하는 것을 잊지 마십시오.