2015-10-04 33 views
0

我有一些我想要重用的XAML。我可以很容易地創建一個自定義控件並使用它,但我寧願不要。以下是我已經試過:在WPF中重用XAML

<Window.Resources> 
    <Expander x:Key="Namespacer" x:Shared="False" Name="NS" Background="SkyBlue"> 
     <StackPanel Name="ClientArea" Margin="20,0,20,0"> 
      <StackPanel Name="Usings" Grid.Row="0" Height="Auto"></StackPanel> 
      <StackPanel Name="Structs" Grid.Row="1" Height="Auto"></StackPanel> 
      <StackPanel Name="Classes" Grid.Row="2" Height="Auto"></StackPanel> 
      <StackPanel Name="IFaces" Grid.Row="3" Height="Auto"></StackPanel> 
      <StackPanel Name="Delegates" Grid.Row="4" Height="Auto"></StackPanel> 
      <StackPanel Name="Enums" Grid.Row="5" Height="Auto"></StackPanel> 
      <StackPanel Name="Nested" Grid.Row="6" Height="Auto"></StackPanel> 
     </StackPanel> 
    </Expander> 
</Window.Resources> 

<StackPanel> 
    <ContentControl Name="N1" Content="{StaticResource Namespacer}" /> 

</StackPanel> 

現在,我想要做的事,如:

this.N1.Header = "SomeTitle.Namespace1"; 

而且還能夠XAML的新組塊N1類似的方式添加到我的疊板。如何實現這一目標?

回答

2

嗯,你可以這樣做:

((Expander)(this.N1.Content)).Header = "SomeTitle.Namespace1"; 

但是得到醜陋。我建議切換到數據綁定。這是一個例子。

首先,這裏有結構的數據類我想你會爲:

public partial class MainWindow : Window 
    { 
    public class MyData 
    { 
     public string ItemTitle { get; set; } 
     public IList<string> Usings { get; set; } 
     public IList<string> Structs { get; set; } 
    } 

    public class MyViewModel 
    { 
     public IList<MyData> MyBoundData { get; set; } 
    } 

    public MainWindow() 
    { 
     var d1 = new MyData{ 
     ItemTitle = "thing1", 
     Usings = new[]{"a", "b"} 
     }; 
     var d2 = new MyData{ 
     ItemTitle = "thing2", 
     Structs = new[]{"c","d"} 
     }; 
     this.DataContext = new MyViewModel{ 
     MyBoundData = new[]{ d1, d2} 
     }; 
     InitializeComponent(); 
    } 
    } 

,這裏是項控件綁定到我們的數據:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
    <ItemsControl ItemsSource="{Binding MyBoundData}" Focusable="False"> 
     <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Expander Header="{Binding ItemTitle}" Background="SkyBlue"> 
      <StackPanel> 
       <Expander Header="Usings" Background="SkyBlue"> 
       <ItemsControl ItemsSource="{Binding Usings}"/> 
       </Expander> 
       <Expander Header="Structs" Background="SkyBlue"> 
       <ItemsControl ItemsSource="{Binding Structs}"/> 
       </Expander> 
      </StackPanel> 
      </Expander> 
     </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    </Grid> 
</Window> 

注意,該項目控制有一個DataTemplate對應於你的「Namespacer」xaml塊。當然,如果您想在多個ItemsControl中使用DataTemplate塊,則可以像在示例中那樣將DataTemplate塊移動到窗口資源中。