我目前正在更改公司内部VS扩展以支持Visual Studio 2012.我正在努力解决的是如何使UI动态适应活动的VS主题。
我找到了几个用于颜色/画笔的资源键(Microsoft.VisualStudio.Shell.11.0.dll中的VsColors / VsBrushes),我可以轻松地使用它来更改扩展的基本颜色方案。问题是标准控件(文本框,组合框,复选框)具有默认的WPF外观,看起来很奇怪。
所以问题是:是否有可能在VS扩展的WPF工具窗口中制作标准控件看起来与Visual Studio中使用的类似?我知道我可以使用控件模板或自定义控件自己完成此操作,但我真的想在某种程度上避免这种努力。
答案 0 :(得分:7)
Visual Studio 2012使用自定义WPF控件。您可以Snoop自行验证。 Visual Studio 2012的WPF可视化树包含Microsoft.VisualStudio.PlatformUI.VsButton, Microsoft.VisualStudio.PlatformUI.Shell.Controls.TabGroupControl, Microsoft.VisualStudio.PlatformUI.SearchControl
等控件。遗憾的是,这些控件没有记录,很难或不可能重复使用。您只能查看复杂元素的样式,并在代码中实现类似的内容。
我基于Winfried Lötzsch collection创建了类似的控件(现在它包含在MahApps.Metro toolkit中)。我还看到another collection有吸引力的元素。它也可能有用。
要实现对Visual Studio主题的支持,我使用Microsoft.VisualStudio.Shell.VsBrushes/VsColors
中的资源和自己的颜色。要将图标转换为当前主题,我使用以下代码:
private readonly IVsUIShell5 _vsUIShell5;
private string _currentThemeId;
// cache icons for specific themes: <<ThemeId, IconForLightTheme>, IconForThemeId>
private readonly Dictionary<Tuple<string, BitmapImage>, BitmapImage> _cacheThemeIcons =
new Dictionary<Tuple<string, BitmapImage>, BitmapImage>();
protected override BitmapImage GetIconCurrentTheme(BitmapImage iconLight)
{
Debug.Assert(iconLight != null);
return _currentThemeId.ToThemesEnum() == Themes.Light ? iconLight : GetCachedIcon(iconLight);
}
private BitmapImage GetCachedIcon(BitmapImage iconLight)
{
BitmapImage cachedIcon;
var key = Tuple.Create(_currentThemeId, iconLight);
if (_cacheThemeIcons.TryGetValue(key, out cachedIcon))
{
return cachedIcon;
}
var backgroundColor = FindResource<Color>(VsColors.ToolWindowBackgroundKey);
cachedIcon = CreateInvertedIcon(iconLight, backgroundColor);
_cacheThemeIcons.Add(key, cachedIcon);
return cachedIcon;
}
private BitmapImage CreateInvertedIcon(BitmapImage inputIcon, Color backgroundColor)
{
using (var bitmap = inputIcon.ToBitmapByPngEncoder())
{
var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
var bitmapData = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
var sourcePointer = bitmapData.Scan0;
var length = Math.Abs(bitmapData.Stride) * bitmap.Height;
var outputBytes = new byte[length];
Marshal.Copy(sourcePointer, outputBytes, 0, length);
_vsUIShell5.ThemeDIBits((UInt32)outputBytes.Length, outputBytes, (UInt32)bitmap.Width,
(UInt32)bitmap.Height, true, backgroundColor.ToUInt());
Marshal.Copy(outputBytes, 0, sourcePointer, length);
bitmap.UnlockBits(bitmapData);
return bitmap.ToPngBitmapImage();
}
}
要正确反转,Light主题的图标应该是另一个Visual Studio图标(带有灰色边框,如此)。
答案 1 :(得分:1)
themes/generic.baml
的资源中有一个Microsoft.VisualStudio.Shell.12.dll
,可能包含您要查找的控件的样式。我使用了dotPeek,但我没有安装插件来可视化Baml文件,你可以尝试一些。
您应该检查许可证是否允许您使用提取的样式= P。