프로그래밍/WPF, Silverlight

[WPF/Silverlight] 컨트롤의 조부모 상속

당근천국 2011. 11. 27. 18:09
다른글에서 닷넷은 다중상속이 안되니 조부모 상속을 이용하라고 하였습니다.
( 참고 :  [.Net] 다중상속이 안된다면 할아버지 상속이다!! - 여러개의 베이스를 상속받기 )

그런데 WPF나 실버라이트의 경우 컨트롤의 조부모 상속을 해보면 에러가 납니다.


'HumanLevel.TabHead.ucTest'의 partial 선언에는 서로 다른 기본 클래스를 지정할 수 없습니다.

완전 수수께끼 같은 오류메시지 입니다-_-;

이 오류는 .xmal과 .cs파일간에 같은 다른 상속을 받기 때문에 발생하는 오류입니다.
위 자물파일을 확인해보면

<UserControl x:Class="HumanLevel.TabHead.ucTest"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    
    <Grid x:Name="LayoutRoot" Background="White">    </Grid>
</UserControl>
컨트롤이 UserControl로 선언 되있음을 알수 있습니다.
이 부분이 베이스랑 일치해야 합니다.
그러면 UserControl를 교체해봅시다.



1. The tag 'baseTabHead' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.

2.'baseTabHead' 형식이 없습니다. 어셈블리 참조가 있는지, 그리고 참조된 모든 어셈블리가 빌드되었는지 확인하십시오.

으잌?
이 말은 자물에  baseTabHead가 로드되지 않아서 찾을수가 없다는 뜻입니다.
이것을 해결하려면 해당 어셈블리를 로드하면되는데.....
말로 설명하면 어렵지만 코드로 보면 쉽습니다.


<baseClass:baseTabHead 
	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:HumanLevel"
	xmlns:baseClass="clr-namespace:HumanLevel;assembly=HumanLevel"
	mc:Ignorable="d"
	x:Class="HumanLevel.ucTest"    d:DesignHeight="300" d:DesignWidth="400">
    
    <Grid x:Name="LayoutRoot" Background="White">    </Grid>
</baseClass:baseTabHead>


어디가 달라졌는지 아시겠습니까?
일단
xmlns:baseClass="clr-namespace:HumanLevel;assembly=HumanLevel"
를 통해 네임스페이스를 로드 하였습니다.
이렇게 선언을 하면 baseClass를 통해 비하인트 코드의 네임스페이스 "HumanLevel"에 접근할수 있습니다.
그러니 컨트롤을 "baseClass:baseTabHead"로 선언하는 것은 "HumanLevel.baseTabHead"를 사용한다는 의미와 같습니다.

빌드해보면 에러가 없이 동작합니다.

여기서 눈여겨 볼건
xmlns:baseClass="clr-namespace:HumanLevel;assembly=HumanLevel"
이거 대신
xmlns:local="clr-namespace:HumanLevel"
이것을 사용해도 된다는 것입니다.

어차피 같은 네임스페이스 안이기 때문에 어셈블리를 로드 할필요가 없습니ㅏ.(이미 로드가 되어있으니까요 ㅎㅎㅎ)