在cppwinrt中以编程方式创建图像按钮

Programmatic creation of image button in cppwinrt

使用 cppwinrt(标准 C++,而非 C++/CX)如何以编程方式将 Button 的内容设置为图像?必须以编程方式进行,因为 cppwinrt 尚不支持 xaml,这样做很容易。这是我正在尝试的方法,结果是一个功能正常但为空的按钮:

Button button = Button();
BitmapImage bitmapImage = BitmapImage();
Uri imageUri = Uri(L"ms-appx:///Assets/Images/stopbutton.png");
bitmapImage.UriSource(imageUri);
Image buttonImage = Image();
buttonImage.Height(30);
buttonImage.Width(30);
buttonImage.Source(bitmapImage);
button.Content(buttonImage);

然后我当然会添加按钮,虽然它是空白的,但它确实显示得很好。我试过 .png 的绝对路径,但也失败了。必须有一种方法可以在 C++ 中以编程方式执行此操作。

好的,这里是让按钮显示填充按钮的图像所需的:不是将 button.Content 设置为图像,而是使用图像创建一个 ImageBrush 并设置 button.Background 到那个 ImageBrush,例如

Button button = Button();
button.Height(30);
button.Width(30);
BitmapImage bitmapImage = BitmapImage();
Uri imageUri = Uri(L"ms-appx:///Assets/Images/stopbutton.png");
bitmapImage.UriSource(imageUri);
ImageBrush imageBrush = ImageBrush();
imageBrush.ImageSource(bitmapImage);
button.Background(imageBrush);
//The button will now look exactly like the image. 

你的原始代码在我这边工作正常。只需确保您的图像确实位于 Assets/Images 文件夹中,您已将其添加到您的项目中,并在构建期间将其与应用程序内容一起复制,方法是检查图像属性中的 Content 参数是否设置为没错。

编辑 阅读您的进一步要求后。只需将按钮填充和边框厚度设置为零,这将删除图像周围的任何 space。

这是一个简单的工作应用程序,其中包含您的按钮创建代码:

#include <winrt\Windows.ApplicationModel.Activation.h>
#include <winrt\Windows.Devices.Enumeration.h>
#include <winrt\Windows.Foundation.h>
#include <winrt\Windows.UI.Xaml.h>
#include <winrt\Windows.UI.Xaml.Controls.h>
#include <winrt\Windows.UI.Xaml.Media.Imaging.h>


using namespace winrt;
using namespace winrt::Windows::ApplicationModel::Activation;
using namespace winrt::Windows::Devices::Enumeration;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::UI::Xaml::Controls;
using namespace winrt::Windows::UI::Xaml::Media::Imaging;


struct App : ApplicationT<App>
{
    void OnLaunched(LaunchActivatedEventArgs const &)
    {
        Image image;
        image.Height(30);
        image.Width(30);
        image.Source(BitmapImage(Uri(L"ms-appx:///Assets/Images/sample.png")));

        Button button;
        button.Padding(ThicknessHelper::FromUniformLength(0));
        button.BorderThickness(ThicknessHelper::FromUniformLength(0));
        button.Content(image);

        Window window = Window::Current();
        window.Content(button);
        window.Activate();
    }

    static void Initialize(ApplicationInitializationCallbackParams const &)
    {
        make<App>();
    }

    static void Start()
    {
        Application::Start(App::Initialize);
    }
};

int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    App::Start();
}