Что такое необработанный тип и почему я часто слышу, что они не должны использоваться в новом коде?
«Необработанный тип» - это использование общего класс без указания аргумента (ов) типа для его параметризованного типа (ов), например используя List
вместо List<String>
. Когда дженерики были введены в Java, несколько классов были обновлены для использования дженериков. Использование этого класса в качестве «необработанного типа» (без указания аргумента типа) позволило сохранить прежний код.
«Необработанные типы» используются для обратной совместимости. Их использование в новом коде не рекомендуется, потому что использование универсального класса с аргументом типа допускает более сильную типизацию, что, в свою очередь, может улучшить понятность кода и привести к появлению потенциальных проблем раньше.
Что такое альтернатива, если мы не можем использовать необработанные типы и как это лучше?
. Предпочтительной альтернативой является использование общих классов, как предполагалось, - с подходящим аргументом типа (например, List<String>
). Это позволяет программисту более конкретно указывать типы, придавая будущим сопровождающим больше смысла предполагаемое использование переменной или структуры данных и позволяет компилятору обеспечивать лучшую безопасность типов. Эти преимущества вместе могут улучшить качество кода и помочь предотвратить появление некоторых ошибок кодирования.
Например, для метода, в котором программист хочет, чтобы переменная List, называемая «имена», содержит только строки:
List<String> names = new ArrayList<String>();
names.add("John"); // OK
names.add(new Integer(1)); // compile error
Отображение 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.
blockquote>
@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>