在WPF按钮旁边显示UAC Shield图标?

问题描述 投票:7回答:3

Microsoft要求按钮和列表条目旁边的UAC Shield图标将打开UAC验证提示。如何在WPF按钮旁边显示此图标?

我已经在网上搜索了一个多小时,但是我无法找到将这个盾牌图标添加到WPF按钮的方法。

我有一个使用普通WPF按钮的WPF表单,但我能找到的大多数脚本都不适用于我 - 主要是因为我的按钮没有FlatStyleHandle属性(我认为WinForms-Buttons具有这些属性)

我正在使用Visual Studio 2015社区和使用WPF的.NET Framework 3.5应用程序

我希望你们能帮助我。祝你今天愉快

c# wpf
3个回答
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签名可以找到here


3
投票

最简单的解决方案:WPF Controls支持嵌套

        <Button Height="30" Width="200">
            <DockPanel>
                <Image Source="ImagePath"/>
                <Label Content="Label"/>
            </DockPanel>
        </Button>

1
投票

非常简单的示例从代码中添加小盾牌图标和按钮文本。该按钮应添加到XAML,名称为“OkButton”。

    [DllImport("user32.dll")]
    static extern IntPtr LoadImage(
        IntPtr hinst,
        string lpszName,
        uint uType,
        int cxDesired,
        int cyDesired,
        uint fuLoad);

    public MainWindow()
    {
        InitializeComponent();

        var image = LoadImage(IntPtr.Zero, "#106", 1, SystemInformation.SmallIconSize.Width, SystemInformation.SmallIconSize.Height, 0);
        var imageSource = Imaging.CreateBitmapSourceFromHIcon(image, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

        // Set button content from code
        var sp = new StackPanel
        {
            Orientation = Orientation.Horizontal,
        };
        sp.Children.Add(new Image { Source = imageSource, Stretch = Stretch.None });
       sp.Children.Add(new TextBlock { Text = "OK", Margin = new Thickness(5, 0, 0, 0) });
        OkButton.Content = sp;
    }
© www.soinside.com 2019 - 2024. All rights reserved.