性能视图用户控件和自定义控件哪个更好?现在我正在使用用户控件,在特定场景中,我创建了大约 200 个(大约)不同的此控件实例,但加载时速度有点慢,我需要等待至少 20-30 秒才能完成操作。我应该怎么做才能提高性能?
场景是:在我的Window中,我有一个TreeView,其中的每一项代表不同的用户定义类型,所以我为每种类型定义了DataTemplate。这些数据模板使用用户控件,并且这些用户控件与用户定义类型的属性绑定。很简单,TreeView 映射用户定义类型的分层数据结构。现在我从 Xml 读取并创建 Heirarchical 结构并将其分配给 TreeView 并且加载需要大量时间。有什么帮助吗?
在我的 TreeView 中,我使用两个不同的类进行绑定。例如,我有一个组,可以有 ChildGroup 并且可以有 Items。该类的示例代码:
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
public class Group
{
public Group(string name)
{
Name = name;
items = new ObservableCollection<Item>();
groups = new ObservableCollection<Group>();
}
public string Name { get;
set;
}
private ObservableCollection<Item> items;
private ObservableCollection<Group> groups;
public ObservableCollection<Item> Items
{
get { return items; }
}
public ObservableCollection<Group> Groups
{
get { return groups; }
}
public IEnumerable<object> AllItems
{
get
{
foreach (var group in groups)
{
yield return …Run Code Online (Sandbox Code Playgroud) 我有以下代码
行的数据模板
<!-- Template for each item in ListView -->
<DataTemplate x:Key="ItemTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="325"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type l:ItemsView}}, Path=ParentColumnWidth}"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0" x:Name="Statement" IsChecked="{Binding Path=statement}" Foreground="{StaticResource CustomWhite}" VerticalAlignment="Center" Style="{StaticResource SelectionCheckBox}"/>
<TextBlock Grid.Column="1" Text="{Binding Path=idate, StringFormat=d MMM yy}" FontSize="15" Foreground="{StaticResource CustomWhite}"/>
<TextBlock Grid.Column="2" Text="{Binding Path=fullcomment}" FontSize="15" Foreground="{StaticResource CustomWhite}"/>
<TextBlock Grid.Column="3" Text="{Binding Path=amount, StringFormat={}{0:N2}}" FontSize="15" Foreground="{Binding Converter={StaticResource GetColourConverterItemAmount}}" TextAlignment="Right" Padding="0,0,25,0"/>
<TextBlock Grid.Column="4" Text="{Binding Path=acc}" FontSize="15" Foreground="{StaticResource CustomWhite}"/>
<TextBlock …Run Code Online (Sandbox Code Playgroud) 我有一个 DataGrid,其中有带有列模板的自定义列,用于插入特殊的工具提示。执行此操作时,如何将此数据复制到剪贴板?
我的 DataGrid 的 XAML 代码:
<DataGrid x:Name="CapabilityGrid" IsReadOnly="True" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Variable">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" ToolTip="{Binding Name, Converter={StaticResource tooltipConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Value">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud) 我正在开发一个 WPF 应用程序,目前我有一个ItemsControl绑定到我的视图模型ObservableCollection,我有一个DataTemplate使用 aUserControl在canvas. 您可以使用多个用户控件,然后根据一个来切换使用哪个Enum?另一种查看它的方法是为基于的项目创建 aButton或 a 。TextBoxObservableCollectionEnum
我得到了一个ItemsControl使用Canvasas 的项目ItemsPanel,它的项目根据绑定类型呈现为不同的 WPF 形状,基本上如下所示:
<ItemsControl ItemsSource="{Binding PreviewShapes}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:UiPreviewLineViewModel}">
<Line X1="{Binding Start.X}" Y1="{Binding Start.Y}"
X2="{Binding End.X}" Y2="{Binding End.Y}"
StrokeThickness="0.75" Stroke="{Binding Brush}" x:Name="Line" ToolTip="{Binding Text}">
</Line>
</DataTemplate>
<DataTemplate DataType="{x:Type local:UiPreviewEllipsisViewModel}">
<Ellipse Canvas.Left="{Binding UpperLeft.X" Canvas.Top="{Binding UpperLeft.Y}"
Width="{Binding Width}" Height="{Binding Height}"
StrokeThickness="0.75" Stroke="{Binding Brush}" x:Name="Ellipse" ToolTip="{Binding Text}">
</Ellipse>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="SketchCanvas" ClipToBounds="False">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
因此,我基本上将对象添加到PreviewShapes视图模型中,并根据它们渲染到 WPFLine或Ellipses 的类型。这基本上可以工作,但附加的属性Canvas.Left和 …
例子:
<ListBox Name="List"
ItemsSource="{Binding Items}"
SelectedIndex="{Binding SelectedIndex}">
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel >
<Button DockPanel.Dock="Left" Content="Show" Command="{Binding ShowCommand}" CommandParameter="{Binding}"/>
<TextBlock Text="{Binding }"/>
</DockPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
单击按钮什么也不做。我试图将命令绑定到 外面的按钮DataTemplate并且它起作用了。我还尝试将按钮注册DataTemplate到 a 中Click_event,这确实有效。
为什么该命令在 DataTemplate 中不起作用?
我想知道在WPF中你是否能够获得datatemplate对象的实际实例.例如,在以下情况中:
<UserControl>
<UserControl.Resources>
<DataTemplate x:Key="MyTemplate">
<CustomControl ></CustomControl>
</DataTemplate>
</UserControl.Resources>
<ListBox DataTemplate="{StaticResource MyTemplate}"></ListBox>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
假设CustomControl有一个CustomEvent和一个公众CustomMethod.我想在用户控件中访问该事件和公共方法.这可能吗?我怎么能这样做?在此先感谢您的帮助.
干杯,
尼鲁
出于某种原因,在dataTemplate中添加的项目将不会执行我告诉他们要做的事情!
我试图将一些图像水平放置在一个堆叠面板中,但无论我如何尝试,它们只是垂直移动.
这是我的xaml.
<DataTemplate x:Name="View">
<Border BorderBrush="Red" BorderThickness="4" >
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource="{Binding Path=_Collection, Mode=OneWay}" >
<ItemsControl.ItemTemplate>
<DataTemplate >
<Image Source="{Binding _Source}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Height="30" FontFamily="Trebuchet MS" FontSize="18" Text="{Binding _Name}" />
</StackPanel>
</Border>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
一切都很好.这是从用户控件内部调用的
<ItemsControl ItemTemplate="{StaticResource siteView}" ItemsSource="{Binding Path=_SiteDisplay"/>
Run Code Online (Sandbox Code Playgroud)
我的obervable集合_SiteDisplay包含另一个名为_Collection的oberservable集合,它保存图像的url.
这是从实际代码中删除的,但说明了问题.我不能让图像水平对齐!非常感谢任何帮助 - 或建议更好的方法.
是否可以对定义的类型选择使用相同的DataTemplate,即如何更改以下示例代码,以便对所有列出的类型使用相同的DataTemplate?
<DataTemplate DataType="{x:Type local:ClassA, ClassB, ...}">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Path=Title}"/>
...
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud) datatemplate ×10
wpf ×9
c# ×3
treeview ×2
button ×1
command ×1
data-binding ×1
itemscontrol ×1
listview ×1
silverlight ×1
stackpanel ×1
wpfdatagrid ×1