許多WPF控制項範本定義沒有考慮到成員為null(預設值)的情況,比如下面定義的HeaderedContentControl的控制項範本:
<ControlTemplate TargetType="HeaderedContentControl">
<DockPanel>
<Border DockPanel.Dock="Top"
BorderBrush="Red" BorderThickness="2"
Padding="5">
<ContentPresenter ContentSource="Header"/>
</Border>
<ContentPresenter/>
</DockPanel>
</ControlTemplate>
然後這樣定義HeaderedContentControl:
<HeaderedContentControl Header="ABC">
<Button>DEF</Button>
</HeaderedContentControl>
還不錯呵呵,可如果把Header屬性省略掉(會成為預設值null),結果會成:
Header此時為null,而Border還會在,而且由於定義了Padding還會佔用一定的空間。
解決方案就是定義ControlTemplate時考慮屬性為null的情況為加入相應的觸發器(Trigger)來隱藏相應控制項。
所以上述ControlTemplate該給Border設定一個名稱,然後通過Trigger判斷Header是否為null,null的話把Border的Visibility改成Collapsed。當然Content屬性就不用判斷為null了,因為Content屬性對應ContentPresenter外面沒有任何其他站位控制項,而且ContentPresenter不會佔用任何控制項(如果Content為null的話):
<ControlTemplate TargetType="HeaderedContentControl">
<DockPanel>
<Border DockPanel.Dock="Top"
Name="border"
BorderBrush="Red" BorderThickness="2"
Padding="5">
<ContentPresenter ContentSource="Header"/>
</Border>
<ContentPresenter/>
</DockPanel>
<ControlTemplate.Triggers>
<Trigger Property="Header" Value="{x:Null}">
<Setter TargetName="border" Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
這樣的話顯示就正確了: