我是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
答案 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>