2009-11-08 10 views
6

Silverlight 3/C#을 사용하고 있으며 버튼을 클릭 한 사용자의 응답으로 프로그래밍 방식으로 일부 XAML 개체를 만들려고합니다.Silverlight에서 프로그래밍 방식으로 캔버스를 배치하려면 어떻게합니까?

그러나, 내가 작성한 Canvas 오브젝트를 배치 할 수없는 것 - 나는 Canvas.LeftProperty 값으로 새로운 CanvasSetValue()를 호출 할 때, 브라우저 창은 빈 화면으로 지워집니다.

private Canvas MakeNewCanvas() 
    { 
     Canvas newCanvas = new Canvas(); 
     newCanvas.Width = newCanvas.Height = 50; 
     newCanvas.SetValue(Canvas.LeftProperty, 10); 
     return newCanvas; 
    } 

을이 호출하는 간단한 버튼 클릭 핸들러 :

private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myPage.Children.Add(MakeNewCanvas()); 
    } 

NB을 내가 문제를 전시하고 간단한 기능을 가지고

는 (좀 더 복잡한 뭔가 시작) : myPage는 내 응용 프로그램의 MainPage XAML 파일에 정의 된 Canvas 객체입니다.

Firefox에서 실행중인 SL 응용 프로그램과 함께 VS 디버거에서이 추적을 수행했으며 브라우저가 실행되면 항상 브라우저가 흰색으로 바뀌고 상태 표시 줄에 따라 데이터 다운로드를 시작합니다. - 즉시 SetValue() 호출이 충돌 될 때, 브라우저가 흰색 간다

myPage.Children.Add(newCanvas); 
    newCanvas.SetValue(Canvas.LeftProperty, 10); 

하지만이 차이가 없습니다 : 나는 같은과 XAML 트리에서 Canvas을 넣어 한 후에 나는 SetValue()를 호출했습니다.

Canvas 클래스는 종속성 속성 열거 형 값이있는 SetValue() 함수를 제외하고 Left/Top 자체를 설정하는 직접적인 방법이없는 것 같습니다. Canvas.SetLeft()Canvas.SetTop()도 있지만 그들은 단지 SetValue()에 shim 일뿐입니다. 어쨌든 그들을 사용하지 않았다.

SetValue()을 호출하지 않으면 맨 위 왼쪽에 예상대로 SL 응용 프로그램에 내 캔버스가 나타납니다 (그리고 내가 추가 한 하위 개체). 내가 기대하는 것처럼 그것이 내가 C#으로 노력하고있어 나에게 보인다 있도록 익스프레션 블렌드에서

내가 만드는 경우와 위치가 Canvas 개체, 다음 XAML 생성,의 Canvas 자체에 Canvas.LeftCanvas.Top 속성 값을 포함해야 작업.

하지만 브라우저에서 SL이 없으면 C#에서 왼쪽/맨 위 값을 설정할 수없는 것처럼 보입니다.

아이디어가 있으십니까?

편집 : 내 접근 방식은 정확하지만 캔버스 좌표는 정수가 아닌 부동 소수점이어야합니다. 자세한 내용은 승인 된 답변을 참조하십시오.

답변

13

코드를 시도하지만, 디버거가 예외를 잡기로, 내가 얻을 : 유형 System.Double의

하는 DependencyProperty는 타입 선택 System.Int32의 객체에 설정할 수 없습니다.

정말 바보 같은 잡았다 - SetValue는 Object 만 취하므로이 같은 문제가 발생하기 쉽습니다.

시도 중 하나

newCanvas.SetValue(Canvas.LeftProperty, 10.0); 

또는

Canvas.SetLeft(newCanvas, 10); 

와 아마 작동합니다.

+1

+1 좋은 잡기, 잘 목격 된 – AnthonyWJones

2

첨부 된 속성의 동작은 처음에는 다소 혼란 스러울 수 있습니다.

속성 Canvas.LeftProperty 및 Canvas.TopProperty는 캔버스의 자식 개체 에 적용됩니다. 따라서 자식 객체가 Canvas에있을 때만 의미가 있습니다. 그것의 WPF/SL 객체를 이해하는 것이 중요하다.

내가 myPageCanvas 유형이 아닌 의심의 아마 Grid는, 따라서 그것은 (그것이하지 않는) 그들을 찾기 위해 방해하는 경우에도 같은 속성과는 무슨 생각이 없을 것이다.

새로운 캔버스를 구체적으로 배치하려면 ~ 캔버스를 추가해야합니다.

+0

네, Canvas 속성이 캔버스의 자식 개체에 적용된다는 것을 알아 내는데 몇 분이 걸렸습니다. myPage는 XAML에 정의 된 Canvas이며 VS 막 디버거에서 this.myPage를 검사하여 새 Canvas를 자식으로 추가하기 직전에 VS가 myPage가 실제로 Canvas 객체라고보고했습니다. – Slacker

관련 문제