C# - 将对象转换为画刷(WPF)

3

我正在尝试通过MenuItem控件设置我的MainWindow的背景,使用MenuItem.Icon。问题是MenuItem.Icon是一个对象,而MainWindow.Background是Brush(或Brush控件)类型。有没有一种方法可以在这两者之间进行转换?我已经尝试了BrushConverter.ConvertFrom,但它无法转换图像对象(这是显示的异常消息)。谢谢!以下是一些XAML代码:

<MenuItem Header="Waterfall" Click="BackgroundMenuItem_Click">
                            <MenuItem.Icon>
                                <Image Source="images/backgrounds/Waterfall.jpg"/>
                            </MenuItem.Icon>
                        </MenuItem>

以下是代码:

//switch background:
//event
private void BackgroundMenuItem_Click(object sender, RoutedEventArgs e)
{
    try
    {
        BackgroundMenuItem_Switch((MenuItem)sender, e);
    }
    catch(Exception exc)
    { MessageBox.Show(exc.Message); }
}
//switch func
private void BackgroundMenuItem_Switch(MenuItem sender, RoutedEventArgs e)
{
    var converter = new BrushConverter();
    var brush = converter.ConvertFrom(sender.Icon);
    this.Background = (Brush)brush;
}

我不确定我是否找到了异常信息。 - Janis S.
你是否正在寻找一个 ImageBrush - wkl
实际上,我更喜欢原始版本而不是编辑后的版本。你实际上正在转换图像,而不是对象。MenuItem.Icon 是一个 object 只是技术细节而已。事实上,这个编辑甚至可能改变问题的含义。我认为其他人可能更容易通过原始标题找到这篇文章。但也许这只是我的想法... - wkl
2个回答

2

你可以从你的图片创建一个ImageBrush

private void BackgroundMenuItem_Switch(MenuItem sender, RoutedEventArgs e)
{
    this.Background = new ImageBrush(((Image)(sender.Icon)).Source);
}

非常感谢!(也感谢其他所有人),似乎由于某种原因,MenuItem.Icon被视为一个没有.Source属性的对象。因此我使用了this.Background = new ImageBrush(((Image)(sender.Icon)).Source); - Yair V.
@Yair 是的,MenuItem.Icon 的类型是 object。我漏掉了这一点。我已经更新了我的答案以包括强制转换。 - wkl

1
您可以使用 ImageBrush:
<Window ...>
    <Window.Background>
        <ImageBrush ImageSource="img/0.png" />
    </Window.Background>
    ...
</Window>

Background = new ImageBrush() { ImageSource = new BitmapImage(new Uri("img/1.png", UriKind.RelativeOrAbsolute)) };

如果您正在使用图像资源,请使用打包URI:

Background = new ImageBrush() { ImageSource = new BitmapImage(new Uri("pack://application:,,,/img/x.png", UriKind.RelativeOrAbsolute)) };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接