Установить изображение в качестве фона кнопки через XAML - PullRequest
5 голосов
/ 08 сентября 2011

Я пытаюсь установить изображение в качестве фона кнопки через XAML.У меня есть конвертер значений, который преобразует путь к значку и возвращает растровое изображение

public static BitmapImage GetImage(String name)
{ 
      //return new BitmapImage from the location of the Path
}

. Я попытался напрямую установить объект изображения в качестве содержимого кнопки, но это не сработало.Затем я попытался установить источник тега ImageBrush в Button.BackGround, но это все еще не работает.

<Button  Margin="3" HorizontalAlignment="Stretch" Grid.Row="1" Grid.Column="0">
    <Button.Background>
        <ImageBrush ImageSource="{Binding Path=IconPath, Converter={StaticResource ImageSourceConverter}}" />
    </Button.Background>
</Button>

Это не определенно проблема с конвертером, поскольку та же логика работает для отображения изображений в моем деревеузлы.Что я тут не так делаю?

Ответы [ 4 ]

5 голосов
/ 08 сентября 2011

Если я вас правильно понял, изначально вы хотели бы привязать содержимое кнопки к значку:

<Button Grid.Column="1">
        <Button.Content>
            <Image Source="{Binding IconPath, PresentationTraceSources.TraceLevel=High}" />
        </Button.Content>
</Button>

Редактировать :
Добавлена ​​отладка для привязки данных.

3 голосов
/ 08 сентября 2011

Я не уверен, что делает конвертер. Простое связывание IconPath с ImageBrush.ImageSource должно работать сразу без конвертера.

Если это не сработает, попробуйте создать панель внутри содержимого кнопки и установить фон панели как ImageBrush. Вот так ...

  <Button>
     <Grid>
        <Grid.Background>
            <ImageBrush ImageSource="../mypath/myimage.png"/>
        </Grid.Background>
     </Grid>
  </Button>
1 голос
/ 08 сентября 2011

Я не знаю наверняка, но я могу предоставить некоторую информацию, которая поможет.

Недавно я попытался сделать что-то еще более простое: изменить цвет фона на кнопке - фактически ToggleButton. Я обнаружил, что установка свойства Background в коде ToggleButton не дает ожидаемого результата. Это удивило меня. Осмотритесь вокруг, и вы увидите, "как мне установить фон для кнопки ToggleButton?" это общий вопрос, и, кажется, нет простого ответа. Я узнал, почему это так сложно.

ToggleButton имеет ControlTemplate, который обеспечивает визуальное представление объекта в действии. Внутри шаблона ControlTemplate по умолчанию предусмотрены анимации для различных переходов состояний. Когда кнопка нажимается, появляется анимация, которую выполняет WPF (я полагаю, что это для WPF4, Silverlight и не уверен насчет предыдущих версий). Когда вы зависаете, появляется другая анимация. И так далее. Кнопка также имеет шаблон управления . Есть нечто, называемое VisualStateManager, которое помогает управлять всеми этими анимациями.

В каждой анимации используется множество цветов, все они жестко закодированы в шаблон по умолчанию (неявный) и не отображаются именованными свойствами. Вы не можете изменить их, не открывая капот ControlTemplate. Свойство Background играет незначительную роль в появлении всех этих анимаций. Другими словами, Фон не делает то, что вы могли ожидать.

Вы можете столкнуться с тем же. Я не эксперт WPF, поэтому хеджирую.

Возможные способы получить то, что вы хотите:

  • вместо установки фона, установите свойство BorderBrush. Это кисть, используемая для рисования Кнопка, по умолчанию ControlTemplate, я думаю.

  • создайте свой собственный элемент управления, проще, без анимаций в шаблоне ControlTemplate, и разрешите фону работать так, как вам хочется.

  • создайте измененный шаблон ControlTemplate и примените его в качестве стиля к кнопке на вашей странице. Вот введение .

1 голос
/ 08 сентября 2011

Трудно сказать, я бы заподозрил, что привязка просто не удалась, ваш DataContext может быть неправильным, установите точку останова в конвертере и посмотрите, какое значение передается, кроме этого, смотрите эту статью по отладке , котораяпредлагает еще несколько советов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...