我有一个MVVM WPF应用程序,我想在VS2012中创建一个类似风格的开始屏幕(如下所示)
我想为上面图片中的最新文档创建一个ListView或堆栈面板。我想使用DataTemplate
执行此操作,以便我可以在应用程序的其他区域中使用该控件。
在WinForms中,我会设计一个用户控件,但在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 :(得分:2)
如果您正在尝试创建类似于VS2012的控件,那么在VS2012中找出“如何”的最佳位置。记住VS2012是用WPF制作的。
因此,如果您获得Snoop并分析“起始页”,您应该看到类似的内容:
正如您所看到的那样,确实正在使用ListBox
。
然后,他们将DataTemplate作为Grid
,使用自定义CheckBox
来保持“固定”状态,然后在右边是另一个Grid
来保存项目图标({{ 1}})和名称(Image
)。
<强>更新强>
至于TextBlock
,他们使用CheckBox
。现在你可以启动反射器来获得确切的定义,或者根据Snoop的数据说,看起来这个控件在其中包含Microsoft.VisualStudio.PlatformUI.ImageCheckBox
和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
和Text
状态。IsPinned
样式并修改它CheckBox
以保存带图像的图像或边框。ControlTemplate
检查ControlTemplate.Triggers
属性并相应地修改IsChecked
以在各种“固定”图片之间切换Image.Source
DataTemplate
ListBox.ItemTemplate
与StackPanel
(Orientation="Horizontal"
)一起生成2个孩子。首先使用上面创建的自定义Style
和第二个TextBlock
。CheckBox.IsChecked
中的DataTemplate
与{Binding IsPinned}
和TextBlock.Text
{Binding Text}
应该是它。您还必须调整ListBox.ItemContainerStyle
来摆脱列表框中的默认鼠标悬停效果,并且可能还设置HorizontalContentAlignment="Stretch"
但它们实际上并不属于您的DataTemplate