2

我有一个 MVVM WPF 应用程序,我想创建一个与 VS2012 风格相似的开始屏幕(如下所示)

列表VS2012

我想为上图中的最近文档创建一个 ListView 或堆栈面板。我想使用 a 来执行此操作,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>

这还没有完成(显然),但这是正确的方法,还是有更好/更标准的方法来做这些事情?

谢谢你的时间。

4

1 回答 1

2

如果您正在尝试创建看起来类似于 VS2012 的控件,那么弄清楚“如何”的最佳位置几乎是在 VS2012 中。记住 VS2012 是用 WPF 制作的。

因此,如果您获得Snoop并分析“起始页”,您应该会看到如下内容:

在此处输入图像描述

正如你所看到的,它确实是一个ListBox正在使用的东西。

然后,他们将 DataTemplate 作为一个Grid自定义CheckBox来保持“固定”状态,然后在右侧是另一个Grid用于保存项目 icon( Image) 和 name( TextBlock)。

更新:

至于CheckBox,他们使用Microsoft.VisualStudio.PlatformUI.ImageCheckBox. 现在您可以启动反射器以获得确切的定义,或者根据 Snoop 的数据说,看起来这个控件在其中包含 aBorder和 an 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以在各种“固定”图像之间切换
  • 有了这个,你可以用( ) 和 2 个孩子来满足你DataTemplate的需求。首先是使用上面创建的自定义复选框,然后是一个.ListBox.ItemTemplateStackPanelOrientation="Horizontal"StyleTextBlock
  • 最后CheckBox.IsCheckedDataTemplatewith{Binding IsPinned}TextBlock.Textwith中绑定{Binding Text}

应该差不多了。您还必须进行调整ListBox.ItemContainerStyle以摆脱 ListBox 中的默认鼠标悬停效果,并且可能还设置了HorizontalContentAlignment="Stretch",但它们并不是您真正的一部分DataTemplate

于 2013-08-23T14:10:23.600 回答