Rodimus74 Ответов: 2

Привязка изображения к кнопке


Я пытаюсь показать изображение внутри кнопки (UWP). Когда я шагаю через код, все объекты создаются правильно, и событие Raise вызывается для обновления страницы XAML - однако изображение не отображается.

В этом примере текстовое содержимое устанавливается на первой кнопке - так что я знаю, что привязка к моему объекту работает.

2-я кнопка с жестко закодированной ссылкой на актив показывает изображение.

Проблема в том, что 3-я кнопка ничего не показывает, хотя я вижу, что XAML вызывает myimage get.

Файл MainPage.язык XAML
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
     <Grid.RowDefinitions>
         <RowDefinition/>
         <RowDefinition/>
         <RowDefinition/>
     </Grid.RowDefinitions>
     <Button Grid.Row="0" Name="Button1" Content="{Binding myText}"/>
     <Button Grid.Row="1" Name="Button2">
         <Image Source="/Assets/windows-sdk.png"/>
     </Button>
     <Button Grid.Row="2" Name="Button3">
         <Image Source="{Binding myImage}"/>
     </Button>
 </Grid>


файл MainPage.язык XAML.в CS

sealed partial class MainPage : Page
    {

        myViewModel aViewModel;

        public MainPage()
        {
            this.InitializeComponent();

            aViewModel = new myViewModel();

            this.DataContext = aViewModel;
        }
    }


myViewModel. cs

class myViewModel : INotifyPropertyChanged
    {
        BitmapImage anImage;
        string someText;

        public BitmapImage myImage
        {
            get { return anImage; }
        }
        public string myText
        {
            get { return someText; }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

        public myViewModel()
        {
            someText = "Some Text";
            RaiseProperty("myText");

            anImage = new BitmapImage(new Uri("ms-appx:/MyAssembly/Assets/windows-sdk.png"));
            RaiseProperty("myImage");
        }
    }


Что я уже пробовал:

Я попытался вернуть строку / uri вместо растрового изображения.

Afzaal Ahmad Zeeshan

Второй подход также хорош, согласно моим мыслям.

Однако вы также можете передать элемент Image — Image control, а затем привязать его к кнопке.

Rodimus74

Спасибо за ваш ответ. Я использовал кнопку 1 & 2 в качестве примера - это номер 3, который я хочу заставить работать, чтобы я мог динамически изменять изображение.

Не могли бы вы предоставить более подробную информацию о предлагаемом вами решении?

Спасибо.

2 Ответов

Рейтинг:
0

Eddie Han

Привет,

Я не знаю точно этого образа.Источник может связываться с BitmapImage.

Но я сделал это, используя последовательность символов.
char[] может связываться с изображением.Источник.

вот вам пример.

код XAML :

<Image
    Source="{Binding ImageSource}"
    />


CS:
public bool ViewingImage(string subject)
{
   string strPath = @"C:\Users\Public\Pictures\Sample Pictures\";
   strPath += subject;
   strPath += ".bmp";
   ImageSource = LoadImageForTest(strPath);
   return true;
}

private byte[] LoadImageForTest(string selectedFileName)
{
   BitmapImage bitmapImage = new BitmapImage();
   bitmapImage.BeginInit();
   bitmapImage.UriSource = new Uri(selectedFileName);
   bitmapImage.EndInit();

   byte[] data;
   JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
    using (MemoryStream ms = new MemoryStream())
    {
        encoder.Save(ms);
        data = ms.ToArray();
     }

     return data;
}


Я надеюсь, что это будет полезно для вас.
Если вам нужна дополнительная информация, пожалуйста, свяжитесь со мной.
Спасибо вам


Рейтинг:
0

Rodimus74

Наконец - то это сработало....

Файл MainPage.язык XAML

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Name="Button1" Content="{Binding myText}"/>
    <Button Grid.Row="1" Name="Button2">
        <Image Source="/Assets/windows-sdk.png"/>
    </Button>
    <Button Grid.Row="2" Name="Button3">
        <Image Source="{Binding myImage}"/>
    </Button>
</Grid>


myViewModel. cs

class myViewModel : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;
        public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); string someText;

        private BitmapImage _myImage;
        public BitmapImage myImage
        {
            get
            {
                Uri myURI = new Uri("ms-appx:///Assets/windows-sdk.png");
               
                _myImage = new BitmapImage(myURI);

                return _myImage;
            }
        }

        public string myText
        {
            get { return someText; }
        }


        public myViewModel()
        {
            someText = "Some Text";
            RaiseProperty("myText");

            RaiseProperty("myImage");
        }
    }