2017-01-25 19 views
4

Я пытаюсь установить фон Mainwindow [через элемент MenuItem], используя MenuItem.Icon. Проблема заключается в том, что MenuItem.Icon является объектом , а Mainwindow.Background - это Кисть (или управление кистью). Есть ли способ конвертировать между этими двумя? Я пробовал BrushConverter.ConvertFrom, но он не может преобразовать объекты Image (это показанное сообщение об исключении). Благодаря! Вот некоторые XAML код:C# - преобразовать объект в кисть (WPF)

<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; 
} 
+0

Не уверен, что я нахожу сообщение об исключении. –

+0

Не будет [ImageBrush] (https://msdn.microsoft.com/en-us/library/system.windows.media.imagebrush (v = vs.110) .aspx) быть тем, что вы ищете? – wkl

+0

На самом деле, я предпочитаю оригинальную версию отредактированной. Вы фактически конвертируете изображение, а не объект. Тот факт, что 'MenuItem.Icon' является« объектом », является просто технической деталью ИМО. Фактически, это изменение может даже изменить смысл вопроса. Я думаю, что другие люди могут легче найти этот пост своим оригинальным названием. Но, возможно, это только я ... – wkl

ответ

2

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

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

Огромное вам спасибо! (и все остальные тоже), кажется, что по какой-то причине MenuItem.Icon обрабатывается как объект, у которого нет свойства .Source. Поэтому я использовал 'this.Background = new ImageBrush (((Image) (sender.Icon)). Source);' – Yair

+0

@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)) };