2009-10-01 3 views
1

또 다른 이상한 WPF 오류 :WPF 사용자 지정 컨트롤 XAML null 오류

간단한 XAML 페이지에 사용자 지정 컨트롤이 있습니다. 프로젝트는 오류없이 완벽하게 빌드되고 실행됩니다. 내가 XAML 디자이너 창에서 XAML 페이지를 보려고하면

<Window x:Class="Grapher2.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:graph="clr-namespace:Grapher2" 
Title="Grapher" Width="800" Height="600"> 

<StackPanel Name="container" Width="700" Height="500"> 
    <graph:GraphCanvas x:Name="graphCanvas" Width="700" Height="500" Background="#ddd" /> 
</StackPanel> 

는하지만,이 메시지가 : 여기

는 XAML의

"Problem Loading--The document contains errors that must be fixed..."

나는 충돌 "디자이너 다시로드"링크를 누르면 오류 목록에 오류 목록이 나타납니다.

"Object reference not set to an instance of an object"

"graph : GraphCanvas ..."로 시작하는 줄에 밑줄이 그어져 있습니다.

오류가이었다 제외하고 내가 원래 모든 것이 동일, 거기에 우리의 개발 서버에서 개발되었다 : 나는의 페이지를 볼 수 있다는 점을 제외

"Request for the permission of type 'System.Security.Permissions.SecurityPermission (...blah blah... failed.)"

가 다시 말하지만, 모든 것이 완벽하게 작동 XAML 디자이너 창, 나머지 응용 프로그램을 개발하지 못하게합니다.

나는 청소, 건물, 재건축 및이 명령의 모든 명령 조합을 성공하지 못했습니다.

편집 :

이 내 첫 번째 사용자 지정 컨트롤입니다 명심하십시오, 나는 끔찍, 끔찍하게 잘못 일을 할 수있다. 내가 말했듯이, 응용 프로그램이 컴파일하고 아름답게 작동하므로 좀 신비 해.

편집 # 2 :

내 파생 캔버스 부분 클래스가 아닙니다. InitializeComponent (What does InitializeComponent() do, and how does it work in WPF?)의 작동 방식을 이해 한 후 내 컨트롤에 연결된 InitializeComponent이 포함 된 자동 생성 부분 클래스는 없습니다. 다시 말하지만 컨트롤은 XAML 디자인보기를 위반하는 경우를 제외하고는 완벽하게 작동합니다.

답변

3

최근에 비슷한 문제가있었습니다. 기본적으로 내 이해 디자이너에서 몇 가지 런타임에서 정확히 같은 순서로 발생하지 않으며 당신이 null 일 수 없다고 생각할 수있는 몇 가지 것들은 실제로 디자인 타임 중에 null입니다.

나는 이런 식으로 문제를 해결했다. 내가 제어 할 수있는 코드의 상당 부분을 사이더에 주석 처리 한 다음 다시 오류가 발생할 때까지 주석 처리를 제거했다. 오류의 소스를 현지화 할 때 다음, 나는 널 (null)이 될 수있는 방법이 없다는 것을 느꼈다 경우에도

if (something != null) 
{ 
... 
} 

으로 문제 부분을 포위. 그리고 얼마 후 오류를 없앴습니다.

"과학적"으로 접근하지는 않지만 내 문제를 해결했습니다. :)

+0

나는 이전에 묘사 한 것과 정확히 똑같은 일을했다. 게시물을 읽은 후 여기에서 시도해 보았고 KeyUp 이벤트 수신기를 컨트롤의 창에 Initialized 이벤트에 추가하고 있음을 발견했습니다. 외관상으로 디자이너는 또한 부모 창이 null 인 Initialized 이벤트를 실행합니다. 감사합니다. – Klay

0

불행히도 이러한 유형의 오류가 너무 흔한 Visual Studio 2008의 Cider 디자이너에는 문제가 있습니다. VS2010의 버전은 크게 향상되었지만 VS2008에서이 문제를 해결하면 안심할 수 있습니다.

+0

논쟁의 여지가 없지만이 문제가 내가 수정할 수있는 문제가 아니라 Cider 오류임을 보여주는 참조에 링크를 추가 할 수 있다면이 대답을 수락 할 것입니다. 다음날에 내가 충분한 증거를 얻으면 그렇게 받아 들일 것입니다. – Klay

0

"Grapher2"가 무엇인지 확실하지 않지만 디자이너가 인스턴스를 생성 할 때 올바르게 실행되지 않는 코드가 생성자에 있는지 확인해야합니다. 데이터베이스 호출과 같은 것이 문제가 될 수 있습니다.

+0

Grapher2는 내 맞춤 컨트롤입니다. 모든 사용자 지정 컨트롤에 자체 XAML 파일이 있어야합니까? 이건하지 않습니다. – Klay

+0

사용자 지정 컨트롤에는 XAML 파일이 없습니다. 그것은 generic.xaml 파일에 ResourceDictionary로 저장된 테마를 가질 것입니다. 사용자 지정 컨트롤이 필요합니까 (소비자 정의 테마가 필요합니까?). 또는 사용자 정의 컨트롤로 자신이하는 일에 충분할 것입니다. – DancesWithBamboo

+0

네, 마우스 움직임에 따라 이미지의 로우 레벨 픽셀 조작을하고 있습니다 : http://stackoverflow.com/questions/1487831/wpf-2d-high-performance-graphics. 그러나 나는 소비자 정의 테마를 전혀 필요로하지 않는다. – Klay

0

비슷한 문제가 발생했습니다.

이것은 설계 모드에서 상위에 렌더링되지 않으므로 부분적인 해결책 일 뿐이지 만 오류를 제거합니다. 지금까지 내가 찾을 수 있었던 최고의 솔루션입니다.

사용자 지정 컨트롤의 생성자.

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
      InitializeComponent(); 

호프가 도움이되었거나 더 나은 해결책을 찾는데 도움이 될 것입니다. 당신이 그래서 그것을 사용할 수 있습니다 게시하시기 바랍니다 경우,

편집
내가 위의 코드를 사용하지 않는 다른 오류) : 유형 ''

그래서 수도의 인스턴스를 만들 수 없습니다 내가 봤던 것과는 다른 문제가 될 수 있지만, 관련성이있는 것처럼 들린다.

+0

내 컨트롤은 Canvas를 확장합니다. 그러나 InitializeComponent를 인식하지 못합니다. 이것이 문제가 될 수 있습니까? – Klay

+0

저는 WPF에 상당히 익숙하지 만, 당신이 뭔가있을 것이라고 생각합니다. 캔버스를 확장하려고 시도하고 InitializeComponent 메서드가 있습니다. – Crispy

+0

정확히 어떻게 캔버스를 확장 했습니까? 새 항목 추가> 클래스를 수행하고 선언 끝에 ": Canvas"를 입력 했습니까? 그게 내가 한거야. 수업이 부분적입니까? – Klay

관련 문제