Программно создать кнопку изображения в WPF - PullRequest
2 голосов
/ 24 ноября 2010

Я хочу создать панель инструментов Windows (что-то вроде RocketDock), которая динамически создает кнопки из сериализованных классов, но я не могу понять, как динамически установить изображение.Кроме того, как следует сериализовать изображение (я хочу сериализовать изображение с классом хранения, вместо того, чтобы каждый раз загружать его из исходного местоположения файла png)?

Я нашел следующий код для созданиясвойство зависимости

public class ImageButton
{
    #region Image dependency property

    public static readonly DependencyProperty ImageProperty;

    public static ImageSource GetImage(DependencyObject obj)
    {
        return (ImageSource)obj.GetValue(ImageProperty);
    }

    public static void SetImage(DependencyObject obj, ImageSource value)
    {
        obj.SetValue(ImageProperty, value);
    }

    #endregion

    static ImageButton()
    {
        var metadata = new FrameworkPropertyMetadata((ImageSource)null);
        ImageProperty = DependencyProperty.RegisterAttached("Image",
                                                            typeof(ImageSource),
                                                            typeof(ImageButton), metadata);
    }
}

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

        <Style x:Key="ImageButton" TargetType="{x:Type Button}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid>
                        <Image Source="{Binding Path=(Extender:ImageButton.Image), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"
                                HorizontalAlignment="Left" Margin="8,0,0,0" Height="16" Width="16" />
                        <TextBlock Text="{TemplateBinding Content}" HorizontalAlignment="Center" />
                    </Grid>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

, но я не могу понять, как установить изображение из кода после созданиякнопка

var newButton = new Button();
var style = (Style)FindResource("ImageButton");

newButton.Image не разрешается.Нужно ли что-то делать с style.Resources?


EDIT - ответ Олли

Спасибо, но ... Используя ...

Link link = new Link(@"c:\temp\dev\ClearAllIcon.png");
    var newButton = new Button();
    newButton.Content = "bloberific";
    var style = (Style)FindResource("ImageButton");
    ImageButton.SetImage(newButton, link.IconSource);
    MainStack.Children.Add(newButton);

, где ссылка определяется как

public Link(string iconPath)
    {
        IconPath = iconPath;
        IconSource = new BitmapImage(new Uri(iconPath));

    }

, изображение не отображается, хотя текст отображается.Кнопка выглядит нормально.

Ответы [ 3 ]

1 голос
/ 25 ноября 2010
Link link = new Link(@"c:\temp\dev\ClearAllIcon.png");
var newButton = new Button();
newButton.Content = "bloberific";
var style = (Style)FindResource("ImageButton");
ImageButton.SetImage(newButton, link.IconSource);
MainStack.Children.Add(newButton);

вы не используете переменную стиля - это проблема?

1 голос
/ 25 ноября 2010

Вы создали не обычное свойство зависимости, а присоединенное свойство зависимости. Ваш экземпляр newButton не имеет определенного свойства "Изображение". Поэтому у вас нет удобного средства получения / установки свойства CLR (подробности см. MSDN ).

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

ImageButton.SetImage(newButton, imageSource);
0 голосов
/ 15 июня 2017

Это помогло мне создать небольшую игру.

var botao = sender as Button;
Image i = new Image();


i.Source= new BitmapImage(new Uri(@"/Resources/x.png", UriKind.RelativeOrAbsolute));
botao.Content = i;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...