Связывание некоторой строки с изображением [duplicate]

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

«Необработанный тип» - это использование общего класс без указания аргумента (ов) типа для его параметризованного типа (ов), например используя List вместо List<String>. Когда дженерики были введены в Java, несколько классов были обновлены для использования дженериков. Использование этого класса в качестве «необработанного типа» (без указания аргумента типа) позволило сохранить прежний код.

«Необработанные типы» используются для обратной совместимости. Их использование в новом коде не рекомендуется, потому что использование универсального класса с аргументом типа допускает более сильную типизацию, что, в свою очередь, может улучшить понятность кода и привести к появлению потенциальных проблем раньше.

Что такое альтернатива, если мы не можем использовать необработанные типы и как это лучше?

. Предпочтительной альтернативой является использование общих классов, как предполагалось, - с подходящим аргументом типа (например, List<String>). Это позволяет программисту более конкретно указывать типы, придавая будущим сопровождающим больше смысла предполагаемое использование переменной или структуры данных и позволяет компилятору обеспечивать лучшую безопасность типов. Эти преимущества вместе могут улучшить качество кода и помочь предотвратить появление некоторых ошибок кодирования.

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

List<String> names = new ArrayList<String>();
names.add("John");          // OK
names.add(new Integer(1));  // compile error
31
задан kurgaan 14 February 2014 в 22:28
поделиться

2 ответа

Отображение Image в WPF намного проще. Попробуйте следующее:

<Image Source="{Binding DisplayedImagePath}" HorizontalAlignment="Left" 
    Margin="0,0,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Bottom" 
    Grid.Row="8" Width="200"  Grid.ColumnSpan="2" />

И свойство может быть просто string:

public string DisplayedImage 
{
    get { return @"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"; }
}

Хотя вы действительно должны добавить свои изображения в папку с именем Images в root вашего проекта и установите Build Action в Resource в окне свойств в Visual Studio ... вы можете получить к ним доступ в этом формате :

public string DisplayedImage 
{
    get { return "/AssemblyName;component/Images/ImageName.jpg"; }
}

UPDATE >>>

В качестве окончательного совета ... если у вас когда-либо возникла проблема с тем, что элемент управления не работает должным образом, просто введите «WPF ', название этого элемента управления, а затем слово «класс» в поисковой системе. В этом случае вы бы набрали «WPF Image Class». Главный результат всегда будет MSDN, и если вы нажмете на ссылку, вы узнаете все об этом элементе управления, и на большинстве страниц также будут примеры кода.


UPDATE 2 >>>

Если вы следовали примерам из ссылки на MSDN и не работали, то ваша проблема - , а не элемент управления Image. Используя свойство string, которое я предложил, попробуйте следующее:

<StackPanel>
    <Image Source="{Binding DisplayedImagePath}" />
    <TextBlock Text="{Binding DisplayedImagePath}" />
</StackPanel>

Если вы не видите путь к файлу в TextBlock, то вы, вероятно, не установили свой DataContext в экземпляр вашей модели представления. Если вы можете видеть текст, тогда проблема связана с вашим пути к файлу.


UPDATE 3 >>>

В .NET 4, вышеуказанные значения Image.Source будут работать. Тем не менее, Microsoft сделала некоторые ужасные изменения в .NET 4.5, которые сломали много разных вещей, и поэтому в .NET 4.5 вам нужно будет использовать полный путь pack следующим образом:

<Image Source="pack://application:,,,/AssemblyName;component/Images/image_to_use.png">

Для получения дополнительной информации о URI пакетов см. URI Pack на странице WPF в Документах Microsoft.

61
ответ дан Sheridan 20 August 2018 в 18:50
поделиться
  • 1
    Спасибо за ответ. Я пробовал этот код, помещал точку останова в DisplayedImage, и к нему, безусловно, обращаются, но нет изображения. – kurgaan 14 February 2014 в 22:46
  • 2
    Извините, это означает, что в форме не отображается изображение. Если я поместил путь непосредственно в XAML, изображение будет показано. – kurgaan 14 February 2014 в 22:53
  • 3
    Да, извините, я не видел вашу собственность должным образом ... Это еще проще, чем это. См. Мое редактирование. – Sheridan 14 February 2014 в 22:54
  • 4
    Ну, это меня ни к чему. Кто-нибудь проверил код с привязанным wpf-изображением? – kurgaan 14 February 2014 в 23:50
  • 5
    Мне очень жаль, что я не понял этого раньше. Спасибо, Шеридан. У меня есть две вкладки в элементе управления вкладкой, которые используют один и тот же UserControl для каждого, но разница является привязкой. Последнее обновление заставило меня понять, что я искал неправильную вкладку, потому что привязка не была настроена. Спасибо вам за помощь. Ты обалденный. – kurgaan 15 February 2014 в 00:24

@Sheridan thx .. если я попробую ваш пример с «DisplayedImagePath» с обеих сторон, он работает с абсолютным путем, как вы показываете.

Что касается путей relative , так я всегда связываю относительные пути, я сначала включаю подкаталог (!) и файл изображения в свой проект .. тогда я использую ~ символ для обозначения пути bin.

    public string DisplayedImagePath
    {
        get { return @"~\..\images\osc.png"; }
    }

Это было протестировано, см. ниже мой обозреватель решений в VS2015 ..

)

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

<Button Click="image_Click" Width="128" Height="128"  Grid.Row="2" VerticalAlignment="Top" HorizontalAlignment="Left">
  <Image x:Name="image" Source="{Binding DisplayedImagePath}" Margin="0,0,0,0" />
</Button>

0
ответ дан Community 20 August 2018 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: