簡體   English   中英

在WPF中重用XAML

[英]Reuse XAML in 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";

並且還能夠以類似的方式在N1中將新的XAML塊添加到我的堆棧面板中。 如何實現呢?

好吧,你可以這樣做:

((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>

請注意,items控件具有一個與“ Namespacer” xaml塊相對應的DataTemplate。 當然,如果您想在多個ItemsControl中使用DataTemplate塊,則可以像在示例中一樣將其移動到窗口資源中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM