Microsoft要求按钮和列表条目旁边的UAC Shield图标将打开UAC验证提示。如何在WPF按钮旁边显示此图标?
我一直在网上搜索超过一个小时,但我无法找到将这个盾牌图标添加到WPF按钮的方法。
我有一个使用普通WPF按钮的WPF表单,但我能找到的大部分脚本都不适用于我 - 主要是因为我的按钮没有FlatStyle
或Handle
property(我认为WinForms-Buttons具有这些属性)
我正在使用Visual Studio 2015社区和使用WPF的.NET Framework 3.5应用程序
我希望你们能帮助我。祝你有愉快的一天
答案 0 :(得分:11)
运行Windows版本的实际Windows图标是通过Win32 API提供的。我不知道.NET中的任何函数可以直接检索它,但是可以通过user32.dll
上的p / invoke访问它。可以找到详细信息here。需要对WPF进行调整,因为链接代码适用于Winforms。
简短摘要:
[DllImport("user32")]
public static extern UInt32 SendMessage
(IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam);
internal const int BCM_FIRST = 0x1600; //Normal button
internal const int BCM_SETSHIELD = (BCM_FIRST + 0x000C); //Elevated button
static internal void AddShieldToButton(Button b)
{
b.FlatStyle = FlatStyle.System;
SendMessage(b.Handle, BCM_SETSHIELD, 0, 0xFFFFFFFF);
}
This可让您直接访问正确的图标,并且可以直接在WPF中使用。
BitmapSource shieldSource = null;
if (Environment.OSVersion.Version.Major >= 6)
{
SHSTOCKICONINFO sii = new SHSTOCKICONINFO();
sii.cbSize = (UInt32) Marshal.SizeOf(typeof(SHSTOCKICONINFO));
Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_SHIELD,
SHGSI.SHGSI_ICON | SHGSI.SHGSI_SMALLICON,
ref sii));
shieldSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
sii.hIcon,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
DestroyIcon(sii.hIcon);
}
else
{
shieldSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
System.Drawing.SystemIcons.Shield.Handle,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
p / Invoke Signatures可以找到here。
答案 1 :(得分:3)
最简单的解决方案:WPF控件支持嵌套
base R
答案 2 :(得分:1)
一个非常简单的示例,从代码中添加了一个小的盾牌图标和按钮文本。 该按钮应以“ OkButton”的名称添加到XAML。
[1,1,0,1,0,1,0,0]