2010-03-29 3 views
3

모두런타임에이 usercontrol 확장의 모든 객체가 null 인 이유는 무엇입니까?

나는 간단한 수업을 운영하고 있습니다.

public class Container : UserControl 
{ 
    public bool IsClickable { get; set; } 
} 

이 클래스를 확장하는 클래스가 있습니다.

public class ScrollingContainer : Container 
{ 
    public void Draw() 
    { 

    } 

    public void Update() 
    { 

    } 
} 

나는 사용자 정의 클래스를 가지고 있으며,이 클래스는 ScrollingContainer를 확장합니다. 내에서 MainPage.xaml에서

public partial class MaskContainer : ScrollingContainer 
{ 

    public MaskContainer() 
    { 
     InitializeComponent(); 
    } 
} 

XAML

<local:ScrollingContainer x:Class="Test.Types.MaskContainer" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:GameObjects;assembly=GameObjects" 
    mc:Ignorable="d" 
    > 
</local:ScrollingContainer> 

, 나는 다음 있습니다.

<types:MaskContainer x:Name="maskContainer" Canvas.ZIndex="1" Width="Auto" Height="Auto"> 
     <Canvas x:Name="maskCanvas"> 
      <Button x:Name="button1" Content="test button"/> 
     </Canvas> 
</types:MaskContainer> 

런타임시 왜 maskCanvas와 button1이 모두 null입니까? maskContainer가 null이 아닙니다.

상속은 여기에서 간단해야합니다. 컨테이너는 usercontrol을 상속합니다. 스크롤 가능한 컨테이너는 컨테이너를 상속합니다. 마스크 컨테이너는 스크롤 가능한 컨테이너를 상속합니다. 이 레벨에서 원래 기본 클래스의 기능을 왜 잃게됩니까? main.xaml 내부의 maskcontainer에 요소 (button1)를 추가하는 것이 올바르지 않습니까?

최종 목표는 재사용 할 수있는 컨테이너를 만드는 것이지만 체인 전체에 걸쳐 지정한 모든 속성/메소드를 상속합니다.

도움을 주시면 감사하겠습니다.

+0

내 경험에 의하면 UserControl에서 파생 된 클래스에서 상속받을 수 없습니다. 성공적으로 해본 적이 있습니까? – Gabe

답변

2

문제는 MaskContainer에 첨부 된 XAML 파일이있어서 WPF 코드gen이 System.Windows.Markup.IComponentConnector을 구현하는 클래스를 생성하도록하는 것입니다. 그리고 컨트롤이 해당 인터페이스를 구현할 때 완전히 새로운 품질을받습니다. 이름 지정 범위 루트이 이됩니다. 즉, 그러한 컨트롤 안에는 완전히 별개의 이름 공간이 있습니다. 외부 컨트롤 이름은 내부 컨트롤 이름과 충돌하지 않습니다. 특히이 경우

, 즉 maskCanvasbutton1 모두 이름 mainpage 내에서 표시되지 않고 대신 MaskContainer 내에서 볼 수있는 것을 의미한다.

사실, 저는 여러분이이 컴파일 된 것을 어떻게 든 얻었음에도 불구하고 매우 놀랍습니다. 내 경험에 비추어 볼 때 Visual Studio에서이 트릭을 시도하면 maskCanvas이 "요소 MaskContainer"에 있다고 불평합니다. 임의로 명령 행 편집을 사용합니까?

그래, 이미 충분히 어쩌구 저쩌구.

해결책은 무엇입니까?MaskContainer에서 XAML 파일을 제거하기 만하면됩니다. 그러면 자동 생성 된 IComponentConnector 구현이 제거되고 모든 것이 예상대로 작동합니다.

0

변수를 확인하기 전에 InitializeComponent()가 이 호출되는지 확인하십시오.

이 변수는 그렇지 않으면 확실히 null입니다. 일반적으로 그리드, 캔버스와 같은 다른 컨트롤을 사용하지만

나는, 어떤 문제로 위를했을 등

확인하는 또 다른 것은 : XAML을 컨테이너 클래스가 있습니까? 이미 Xaml을 사용하는 클래스에서 Xaml을 하위 클래스 화하고 사용할 수 있다고 생각하지 않습니다.

+0

InitalizeComponent가 호출되고 있는지 100 % 확인할 수 있습니다. 컨테이너 클래스에 xaml이 없습니다. 컨테이너 클래스는 위와 같이 명시되어 있습니다. 간단한 속성을 가진 매우 간단한 클래스입니다. 내가하려는 것은 다른 클래스에서 정의한 추가 속성을 사용하여 usercontrol을 정의하는 것입니다. 내가 원하는 것은이 사용자 정의 컨트롤을 만든 다음 다른 xaml 페이지에서 요소를 추가하는 것입니다. – csciguy

+0

Xaml에서 local : ScrollingContainer를 선언하면 자식이 없도록 선언합니다. 그러나 기본 페이지/창에서 자녀를 추가합니다. Xaml이이를 지원한다고 생각하지 않습니다. 자녀를 맞춤 컨트롤에 넣으려면 기본 페이지 나 창 대신 Xaml을 사용해야합니다. 이것이 당신에게 문제가된다면, 이것을 설정하는 더 좋은 방법이있을 것입니다 (더 나은 디자인 선택). 이러한 이유로 Border 등의 일부 컨트롤에는 기본 페이지 나 창에서 설정할 수있는 단일 Child 속성이 있지만 시나리오에 가장 적합한 옵션은 아닙니다. – jonathanpeppers

+0

내 생각은 다른 디자이너 그룹이 잠겨 있지 않은 컨트롤을 만드는 것입니다. 나는 usercontrol을 확장하고 싶지만 내 자신의 요소를 추가하려면 디자이너가 기본 페이지 (또는 다른 디자인 페이지)에서 그 컨트롤에 자식을 추가 할 수있게하십시오. UserControl 대신 Canvas를 확장하면이 동일한 문제가 발생합니까? – csciguy

0

나는 실제로 현재 RC에서, 내가하려는 것처럼 사용자 정의 컨트롤을 확장 할 수 없다는 것을 알았습니다. 내가 지금까지 문제를 해결하기 위해 끝낸 것은 시스템의 기대치를 낮추고 사용자 정의 컨트롤 대신 Canvas를 확장하는 것이 었습니다. 나는 usercontrol을 확장하는 것을 선호했을 것이다. 그러나 오 잘. 지금은 이것으로 충분할 것입니다.

관련 문제