2010-01-20 78 views
2

我有一個名爲SpecialExpander的自定義擴展控件。它基本上只是一個標準的Expander與一個花哨的頭和一些屬性(HeaderTextIsMarkedRead)。將ContentControl *放入WPF DataTemplate中?

我開始通過創建一個簡單的類:

public class SpecialExpander : Expander 
{ 
    public string HeaderText { get; set; } 
    public bool IsMarkedRead { get; set; } 
} 

然後,我創建了一個設置在膨脹機(例如,邊距,填充等),更重要的幾個屬性的樣式,它還定義了自定義DataTemplateHeaderTemplate屬性。該模板基本上是一個兩行的網格。

如下面圖所示...

  • 的頂行,我想有固定的佈局(它總是TextBlockTextBlockCheckBox
  • 的底部行,但是,我想能夠爲每個擴展器提供定製的XAML。

我試着把<ContentControl Grid.Row="1" ... />放在DataTemplate中,但我無法弄清楚如何正確連接它。


alt text http://img85.imageshack.us/img85/1194/contentcontrolwithintem.jpg


alt text http://img29.imageshack.us/img29/1194/contentcontrolwithintem.jpg


問題

如何建立一個DataTemplateSpecialExpander使頭部具有索姆e固定內容(頂行)和自定義內容的佔位符(底行)?

對於第二個例子,我希望能夠做這樣的事情:

<SpecialExpander HeaderText="<Expander Header Text>" IsMarkedRead="True"> 
    <SpecialExpander.Header> 
     <StackPanel Orientation="Horizontal"> 
      <RadioButton Content="High" /> 
      <RadioButton Content="Med" /> 
      <RadioButton Content="Low" /> 
     </StackPanel> 
    <SpecialExpander.Header> 
    <Grid> 
     <Label>Main Content Goes Here</Label> 
    </Grid> 
</SpecialExpander> 

回答

1

今天早上打我如何解決這個問題:而不是建立一個SpecialExpander,我只需要一個正常的Expander 。然後,對於標題,我將使用名爲SpecialExpanderHeader的自定義ContentControl

這是它的工作原理...

SpecialExpanderHeader類:

public class SpecialExpanderHeader : ContentControl 
{ 
    public string HeaderText { get; set; } 
    public bool IsMarkedRead { get; set; } 
} 

SpecialExpanderHeader風格:

<Style TargetType="custom:SpecialExpanderHeader"> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="custom:SpecialExpanderHeader"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="5" /> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 
        <StackPanel Grid.Row="0" Orientation="Horizontal"> 
         <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=HeaderText}" /> 
         <CheckBox Margin="100,0,0,0" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=IsMarkedRead}" /> 
        </StackPanel> 
        <Separator Grid.Row="1" /> 
        <ContentPresenter Grid.Row="2" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

擴展風格

<Style x:Key="Local_ExpanderStyle" TargetType="Expander" BasedOn="{StaticResource {x:Type Expander}}"> 
    <Setter Property="Margin" Value="0,0,0,10" /> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="FontSize" Value="12" /> 
</Style> 

使用

<Expander Style="{StaticResource Local_ExpanderStyle}"> 
    <Expander.Header> 
     <custom:SpecialExpanderHeader IsMarkedRead="True" HeaderText="Test"> 
      <StackPanel Orientation="Horizontal"> 
       <RadioButton Content="High" /> 
       <RadioButton Content="Medium" /> 
       <RadioButton Content="Low" /> 
      </StackPanel> 
     </custom:SpecialExpanderHeader> 
    </Expander.Header> 
    <Grid> 
     <!-- main expander content goes here --> 
    </Grid> 
</Expander> 
+0

我喜歡它,當發生這種情況:) – 2010-01-20 22:48:02

+0

嗨,如果它是確定你的話,你可以跟我們分享這個示例應用程序,請讓每個人都能享受的代碼? – SharpUrBrain 2010-12-03 06:42:12