2013-08-23 96 views
2

我有一个MVVM WPF应用程序,我想创造风格相似的开始屏幕上的一个在VS2012(如下图所示)创建VS2012风格的ListView /堆栈面板中的WPF

ListVS2012

我想创建一个ListView或堆栈面板,就像上图中的最近文档一样。我想用DataTemplate这样做,这样我就可以在应用程序的其他区域使用该控件。在WinForms中,我将设计一个用户控件,但在WPF中,我很困惑,因为要做到这一点,最好的方法是使用WPF。我已经使用包含数据模板的资源文件,对锁定/解除固定图像的转换视为

<DataTemplate x:Key="imageWithTextBlockTemplate"> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
     <Image Source="{Binding Converter={StaticResource booleanToImageConverter}}" 
           Stretch="UniformToFill" Width="16"/> 
     <TextBlock Text="{Binding}"/> 
    </StackPanel> 
</DataTemplate> 

这还没完(清楚),但是这是正确的做法,或者有更好的/更标准的做这种事情的方式?

谢谢你的时间。

+0

为什么不在WPF中设计UserControl? – Dutts

+0

我可以做,但我的印象是,要在列表视图中获取图像和文本,我无法使用现有的控件,必须创建自己的控件。总之,我有点困惑,因为正确的做法... – MoonKnight

+1

对不起,我的评论是相当轻浮。实际上,我认为你提出的使用DataTemplate的解决方案完全合理,比写一个全新的控件更“WPF”。 – Dutts

回答

2

如果您正在尝试创建类似于VS2012的控件,那么在VS2012中找出“如何”的最佳位置非常重要。记得VS2012是用WPF制作的。

所以,如果你得到Snoop和分析“起始页”,你会看到如下:

enter image description here

正如你可以看到它确实是一个ListBox是正在使用。

然后,他们有DataTemplate中与自定义CheckBox举办“固定”状态,然后右边是另一Grid持有项目图标(Image)和名称(TextBlock)一Grid

更新:

至于CheckBox,他们使用Microsoft.VisualStudio.PlatformUI.ImageCheckBox。现在你可以启动反射器来获得确切的定义,或者根据Snoop的数据说,它看起来像这个控件在其中包含一个Border和一个Image。它采用

Image来源是如:

pack://application:,,,/Microsoft.VisualStudio.Shell.11.0;component/UI/Images/pinned normal.png 

pack://application:,,,/Microsoft.VisualStudio.Shell.11.0;component/UI/Images/unpinned normal.png 

现在为你实现这个信息,

  • 我会在你的虚拟机收集的各个项目,请按住TextIsPinned状态。
  • 接下来,创建一个自定义CheckBox样式,并修改它的ControlTemplate以保存包含图像的图像或边框。
  • 使用ControlTemplate.Triggers检查IsChecked财产,并相应修改Image.Source
  • 有了这个各种“固定”的图像之间进行切换,你可以有你DataTemplateListBox.ItemTemplateStackPanelOrientation="Horizontal")几乎与2名儿童。首先使用上面创建的自定义Style和第二个TextBlock复选框。
  • 最后绑定在DataTemplate{Binding IsPinned}TextBlock.TextCheckBox.IsChecked{Binding Text}

,应该是相当多了。你不得不调整ListBox.ItemContainerStyle摆脱从列表框中说默认的鼠标悬停效果,也可能设置HorizontalContentAlignment="Stretch",但它们不是你的一部分DataTemplate