Хорошей идеей является использование «объектно-реляционного картографа», подобного Idiorm :
$user = ORM::for_table('user')
->where_equal('username', 'j4mie')
->find_one();
$user->first_name = 'Jamie';
$user->save();
$tweets = ORM::for_table('tweet')
->select('tweet.*')
->join('user', array(
'user.id', '=', 'tweet.user_id'
))
->where_equal('user.username', 'j4mie')
->find_many();
foreach ($tweets as $tweet) {
echo $tweet->text;
}
Он не только избавляет вас от SQL-инъекций, но и от синтаксических ошибок! Также поддерживает коллекции моделей с цепочкой методов для фильтрации или применения действий к нескольким результатам сразу и нескольких подключений.
После того, как я столкнулся с той же проблемой, что и вы, и немного почитал, я обнаружил решение - Pack URIs .
Я сделал следующее в коде:
Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;
Или короче, используя другой конструктор BitmapImage:
finalImage.Source = new BitmapImage(
new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));
URI разбит на части:
приложение: ///
Путь: имя файла ресурсов, который скомпилирован в сборку, на которую указывает ссылка. Путь должен соответствовать следующему формату: AssemblyShortName [; Version] [; PublicKey]; component / Path
Три косой черты после application:
необходимо заменить запятыми:
Примечание: компонент полномочий в URI пакета это встроенный URI, который указывает на пакет и должен соответствовать RFC 2396. Кроме того, символ "/" должен заменить символом ",", и зарезервированные символы, такие как "%" а также "?" нужно избежать. Посмотреть OPC для получения подробной информации.
И, конечно же, убедитесь, что вы установили действие сборки для своего образа на Ресурс
.
Поместите кадр в VisualBrush:
VisualBrush brush = new VisualBrush { TileMode = TileMode.None };
brush.Visual = frame;
brush.AlignmentX = AlignmentX.Center;
brush.AlignmentY = AlignmentY.Center;
brush.Stretch = Stretch.Uniform;
Помещенный VisualBrush в GeometryDrawing
GeometryDrawing drawing = new GeometryDrawing();
drawing.Brush = brush;
// Brush this in 1, 1 ratio
RectangleGeometry rect = new RectangleGeometry { Rect = new Rect(0, 0, 1, 1) };
drawing.Geometry = rect;
Теперь помещают GeometryDrawing в DrawingImage:
new DrawingImage(drawing);
Место это на Вашем источнике изображения и voilГ!
Вы могли сделать это намного легче хотя:
<Image>
<Image.Source>
<BitmapImage UriSource="/yourassembly;component/YourImage.PNG"></BitmapImage>
</Image.Source>
</Image>
И в коде:
BitmapImage image = new BitmapImage { UriSource="/yourassembly;component/YourImage.PNG" };
Имейте Вас попробованный:
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
_icon.Source = bitmap;
Вот пример, который устанавливает изображение путь динамически (изображение находится где-то на диске, а не создается как ресурс):
if (File.Exists(imagePath))
{
// Create image element to set as icon on the menu element
Image icon = new Image();
BitmapImage bmImage = new BitmapImage();
bmImage.BeginInit();
bmImage.UriSource = new Uri(imagePath, UriKind.Absolute);
bmImage.EndInit();
icon.Source = bmImage;
icon.MaxWidth = 25;
item.Icon = icon;
}
На первый взгляд вы могли подумать, что свойство Icon может содержать только изображение. Но на самом деле он может содержать что угодно! Я обнаружил это случайно, когда программно попытался установить свойство Image
непосредственно на строку с путем к изображению. В результате отображалось не изображение, а фактический текст пути!
Это приводит к альтернативе, заключающейся в том, что не нужно создавать изображение для значка, а вместо этого использовать текст с символьным шрифтом для отображения простого "икона". В следующем примере используется шрифт Wingdings , который содержит символ «дискета». Этот символ на самом деле является символом <
, который имеет особое значение в XAML, поэтому вместо этого мы должны использовать закодированную версию & lt;
. Это работает как мечта! Ниже показан символ дискеты в виде значка в пункте меню:
<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
<MenuItem.Icon>
<Label VerticalAlignment="Center" HorizontalAlignment="Center" FontFamily="Wingdings"><</Label>
</MenuItem.Icon>
</MenuItem>
var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);
Это загрузит изображение с именем «Untitled.png» в папку с именем «Images» с его «Build Action», установленным на «Resource», в сборке с именем «WpfApplication1».
Это немного меньше кода и может быть сделано в одной строке.
string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;
Также есть проще проще. Если изображение загружено в виде ресурса в XAML, и в вопросе кода - это код, который является кодовым, который для этого XAML:
Вот словарь ресурсов для XAML-файла - единственная строка, которую вы заботитесь о том, является Imagebrush с ключом «Posterbrush «- Остальная часть кода - просто чтобы показать контекст
<UserControl.Resources>
<ResourceDictionary>
<ImageBrush x:Key="PosterBrush" ImageSource="..\Resources\Images\EmptyPoster.jpg" Stretch="UniformToFill"/>
</ResourceDictionary>
</UserControl.Resources>
Теперь, в коде, вы можете просто сделать это
ImageBrush posterBrush = (ImageBrush)Resources["PosterBrush"];
Как загрузить изображение из встроенных в ресурсы значков и изображений (исправленная версия Arcturus):
Предположим, вы хотите добавить кнопку с изображением. Что делать?
Теперь пора загрузить наше изображение в XAML
Готово.
Если у вас уже есть поток и вы знаете его формат, вы можете использовать что-то вроде этого:
static ImageSource PngStreamToImageSource (Stream pngStream) {
var decoder = new PngBitmapDecoder(pngStream,
BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
return decoder.Frames[0];
}
Я новичок в WPF, но не в .NET.
Я потратил пять часов, пытаясь добавить файл PNG в «Проект библиотеки настраиваемых элементов управления WPF» в .NET 3.5 (Visual Studio 2010) и установить его в качестве фона для элемента управления, унаследованного от изображения.
Ничего подобного с URI не работало. Я не могу себе представить, почему нет метода для получения URI из файла ресурсов через IntelliSense, например:
Properties.Resources.ResourceManager.GetURI("my_image");
Я пробовал много URI и играл с ResourceManager и методами GetManifest Assembly, но все были исключения или значения NULL.
Вот код, который у меня работал:
// Convert the image in resources to a Stream
Stream ms = new MemoryStream()
Properties.Resources.MyImage.Save(ms, ImageFormat.Png);
// Create a BitmapImage with the stream.
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = ms;
bitmap.EndInit();
// Set as source
Source = bitmap;
Есть способ попроще. Если изображение загружается как ресурс в XAML, а рассматриваемый код является выделенным кодом для этого содержимого XAML:
Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute);
NotifyIcon.Icon = BitmapFrame.Create(iconUri);