在wpf中重用XAML?

时间:2017-06-09 10:21:36

标签: wpf

我是WPF的新手,但现在已经使用了一个月,并注意到我可能正在构建我的UI错误。

以下是该场景:我有一个特定的容器,例如:

<DockPanel>
   <WrapPanel>
       ... some buttons here which are always the same.
   <WrapPanel>
   <Grid name="myGrid" ...contains some attributes>
       // Everything inside here is generated dynamically.
   <Grid>
</DockPanel>

我的问题是如何处理这种情况?我想创建某种模板,以便我可以重用它。模板应该是您在上面看到的整个构造。现在我正在创建&#34;整个&#34;部分代码似乎有点矫枉过正。所以我可以根据需要创建尽可能多的Dockpanel,但唯一不同的内容就是在我的网格中。

我想为此任务定义一个单独的XML文档(我称之为UI模块),我可以将其用作模板。所以在代码中我希望我可以做类似的事情:

我试图在伪代码中实现的示例:

var panel = createNewControlFrom("/MySpecialDockPanel.xaml");
panel.Background = // Different color.
var panel.Children.FindName("myGrid");

loop start
   // Add children to panels grid.
loop end

2 个答案:

答案 0 :(得分:3)

如果您只是希望能够重用一段UI,则可以创建UserControl并定义可重复使用的XAML标记以及此处的任何代码。

然后,您可以通过编程方式创建此UserControl的任意数量的实例:

UserControl1 uc = new UserControl1();

...或在另一个类的XAML标记中,例如窗口:

<local:UserControl1 />

答案 1 :(得分:2)

以下是WPF中使用的内容的细分: 的的DataTemplate
这与某些类型的集合一起使用,所以说你有一个类:

class ModelItem //Implements INotifyPropertyChanged
{
    public int ID { get; set; }
    public string Name { get; set; }
}  

这将是您ViewModel

中的一个集合
public class MainViewModel //Implements INotifyPropertyChanged
{
    List<ModelItem> Items { get; set; }
}  

然后在你的xaml中你会像这样使用它:

<UserControl x:Class="SO_app.ForAsperger"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:SO_app"
         xmlns:vm="clr-namespace:VM;assembly=VM"//this is where we define reference to our ViewModel
         xmlns:model="clr-namespace:Model;assembly=Model"//this is where we define our model object so we know the structure for our DataTemplate
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
    <vm:MainViewModel/>//Here we assign the ViewModel to our View
</UserControl.DataContext>
<UserControl.Resources>//this is where you can place Collections, Styles, Controls etc ...
    <DataTemplate x:Key="keyToReferToInXaml">
        <TextBlock Text="SomeText"/>
    </DataTemplate>
<CollectionViewSource Source="{Binding Items}" x:Key="items"/>//this is a collection of the same items but held as a StaticResource which you can then reference like <ItemsControl ItemsSource="{Binding Source={StaticResource items}}"/>
</UserControl.Resources>
<ItemsControl ItemsSource="{Binding Items}">//This is our List, you can use ListView or ListBox if this seems intimidating
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type model:ModelItem}">//We define the target type for this DataTemplate
            <TextBlock Text="{Binding Name}"/>//Binding will pick up the properties from ModelItem and display them in a TextBlock
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>