С# - преобразовать объект в кисть (WPF)

Я пытаюсь установить фон моего основного окна [через элемент управления MenuItem], используя MenuItem.Icon. Проблема заключается в том, что MenuItem.Icon — это объект, а Mainwindow.Background — тип Brush (или Brush Control). Есть ли способ преобразования между этими двумя? Я пробовал использовать 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;
}

person Yair    schedule 25.01.2017    source источник
comment
Не уверен, что нашел сообщение об исключении.   -  person Janis S.    schedule 25.01.2017
comment
Разве ImageBrush быть тем, что вы ищете?   -  person wkl    schedule 25.01.2017
comment
На самом деле, я предпочитаю оригинальную версию отредактированной. На самом деле вы конвертируете изображение, а не объект. Тот факт, что MenuItem.Icon является object, является лишь технической деталью IMO. Фактически, это редактирование может даже изменить смысл вопроса. Я думаю, что другим людям будет легче найти этот пост по его оригинальному названию. Но, может быть, это только я...   -  person wkl    schedule 25.01.2017


Ответы (2)


Вы можете создать ImageBrush с вашего изображения.

private void BackgroundMenuItem_Switch(MenuItem sender, RoutedEventArgs e)
{
    this.Background = new ImageBrush(((Image)(sender.Icon)).Source);
}
person wkl    schedule 25.01.2017
comment
Большое спасибо! (и все остальные тоже), кажется, что по какой-то причине MenuItem.Icon рассматривается как объект, у которого нет свойства .Source. Поэтому я использовал this.Background = new ImageBrush(((Image)(sender.Icon)).Source); - person Yair; 25.01.2017
comment
@Yair Да, MenuItem.Icon имеет тип object. Я пропустил это. Я обновил свой ответ, включив в него актерский состав. - person wkl; 25.01.2017

Вы можете использовать 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)) };
person mm8    schedule 25.01.2017