我对c#很陌生,我要做的第一件事就是带有数据绑定的ListView
,结果还不错。
如果基础模型有任何子项(如TreeView
),我现在正试图让项目有一个扭曲按钮。每个孩子的列都与所有顶级项目相同。
我该怎么做呢?这样的控件是否存在?如果不是,我会更好地打扮TreeView
看起来像ListView
,或打扮ListView
看起来像TreeView
?
我沿着这条solution中描绘的道路走了一条TreeView
,但最终结果看起来非常糟糕,标题实际上只是一个项目,所以你失去了所有漂亮的列大小和列按钮可以连接到ListView
中的列排序,这样路线实际上看起来就更有用了。
我注意到新任务管理器的控件与我正在创建的控件完全一样,我不知道这是怎么做的?可能在C中。
答案 0 :(得分:11)
Microsoft提供了一个看似您正在寻找的示例。可以在此处找到示例的说明:
http://msdn.microsoft.com/en-us/library/vstudio/ms771523(v=vs.90).aspx
当您构建并运行该示例时,您将得到类似于此的内容:
示例中完成了大量的模板操作,因此您可以按照自己的方式进行操作。
答案 1 :(得分:9)
Style
ListView
TreeView
可能会更容易,我有一个快速的游戏,并设法在大约10分钟内创建一个模型。
显然,您需要添加更多内容,但在ListView
列中托管<Window x:Class="WpfApplication8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="233" Width="405" Name="UI">
<Grid DataContext="{Binding ElementName=UI}">
<ListView ItemsSource="{Binding Processes}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Process" Width="200" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<TreeView BorderThickness="0" ItemsSource="{Binding Processes}" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Processes}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="CPU" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding CpuUsage, StringFormat={}{0} %}" TextAlignment="Right" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Memory" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MemUsage, StringFormat={}{0} MB}" TextAlignment="Right" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
</Window>
似乎相当容易。
如果你想使用构建代码,这是模型代码。
的Xaml:
public partial class MainWindow : Window
{
private ObservableCollection<ProcessInfo> _processes = new ObservableCollection<ProcessInfo>();
public MainWindow()
{
InitializeComponent();
Processes.Add(new ProcessInfo
{
CpuUsage = 10.3,
MemUsage = 48.9,
Processes = new ObservableCollection<Process>()
});
var pro = new Process{ Name = "Process1", Processes = new ObservableCollection<Process>()};
pro.Processes.Add(new Process { Name = "SubProcess1", Processes = new ObservableCollection<Process>() });
Processes[0].Processes.Add(pro);
Processes.Add(new ProcessInfo
{
CpuUsage = 0,
MemUsage = 100,
Processes = new ObservableCollection<Process>()
});
var pro2 = new Process { Name = "Process2", Processes = new ObservableCollection<Process>() };
pro2.Processes.Add(new Process { Name = "SubProcess1", Processes = new ObservableCollection<Process>() });
pro2.Processes.Add(new Process { Name = "SubProcess2", Processes = new ObservableCollection<Process>() });
pro2.Processes.Add(new Process { Name = "SubProcess3", Processes = new ObservableCollection<Process>() });
Processes[1].Processes.Add(pro2);
}
public ObservableCollection<ProcessInfo> Processes
{
get { return _processes; }
set { _processes = value; }
}
}
public class ProcessInfo
{
public ObservableCollection<Process> Processes { get; set; }
public double CpuUsage { get; set; }
public double MemUsage { get; set; }
}
public class Process
{
public string Name { get; set; }
public ObservableCollection<Process> Processes { get; set; }
}
代码:对于加载树形模型数据抱歉:)
{{1}}祝你好运:)
答案 2 :(得分:3)
你所描述的听起来有点像TreeListView,如果你谷歌'WPF TreeListView',你会看到一些可能对你有用的解决方案。我使用了Telerik中的一个,但根据您的需求有多复杂,它可能有点过分。
如果您只想要一个子级别,例如您附加的图像,您可能想要使用带有复杂DataTemplate的ListView为第一列滚动自己,这将显示扩展器按钮和绑定到子项的简单ListBox项目
与answer here类似,但您的单元格的复选框样式与箭头,项目文本和子ListBox类似。然后将子ListBox的可见性绑定到复选框的状态。