Estou tentando definir a fonte de uma imagem WPF no código. A imagem é incorporada como um recurso no projeto. Olhando para os exemplos, criei o código abaixo. Por alguma razão, não funciona - a imagem não aparece.
Ao depurar, posso ver que o fluxo contém os dados da imagem. Então, oque há de errado?
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;
O ícone é definido mais ou menos assim: <Image x:Name="_icon" Width="16" Height="16" />
<Image Source="some_fully_qualified_path">
o XAML nunca falha.Respostas:
Depois de ter o mesmo problema que você e fazer algumas leituras, descobri a solução - URIs do pacote .
Eu fiz o seguinte no código:
Ou mais curto, usando outro construtor BitmapImage:
O URI é dividido em partes:
application:///
Caminho: o nome de um arquivo de recurso que é compilado em um assembly referenciado. O caminho deve estar em conformidade com o seguinte formato:
AssemblyShortName[;Version][;PublicKey];component/Path
As três barras depois
application:
devem ser substituídas por vírgulas:E, é claro, certifique-se de definir a ação de compilação na sua imagem como
Resource
.fonte
BitmapImage(Uri)
construtor, o que ajuda a evitar a necessidade de chamar BeginInit e EndInit. Eu adicionei aqui.Isso carregará uma imagem chamada "Untitled.png" em uma pasta chamada "Imagens" com sua "Ação de compilação" definida como "Recurso" em um assembly chamado "WpfApplication1".
fonte
var uriSource = new Uri("Images/Untitled.png", UriKind.Relative);
seria suficienteIsso é um pouco menos de código e pode ser feito em uma única linha.
fonte
Muito fácil:
Para definir a imagem de um item de menu dinamicamente, faça o seguinte:
... enquanto "icon.ico" pode estar localizado em qualquer lugar (atualmente está localizado no diretório 'Recursos') e deve estar vinculado como Recurso ...
fonte
Você também pode reduzir isso para uma linha. Este é o código que usei para definir o ícone na minha janela principal. Ele assume que o arquivo .ico está marcado como Conteúdo e está sendo copiado para o diretório de saída.
fonte
Maneira mais simples:
fonte
Você tentou:
fonte
Esta é a minha maneira:
Uso:
fonte
Aqui está um exemplo que define o caminho da imagem dinamicamente (imagem localizada em algum lugar do disco, em vez de criar como recurso):
Reflexões sobre ícones ...
Primeiro, você pensaria que a propriedade Icon pode conter apenas uma imagem. Mas na verdade pode conter qualquer coisa! Descobri isso por acidente quando tentei programaticamente definir o
Image
propriedade diretamente para uma seqüência de caracteres com o caminho para uma imagem. O resultado foi que ele não mostrou a imagem, mas o texto real do caminho!Isso leva a uma alternativa para não precisar criar uma imagem para o ícone, mas use o texto com uma fonte de símbolo para exibir um "ícone" simples. O exemplo a seguir usa a fonte Wingdings que contém um símbolo "disquete". Este símbolo é realmente o personagem
<
, que tem um significado especial em XAML, portanto, temos que usar a versão codificada<
. Isso funciona como um sonho! A seguir, é mostrado um símbolo de disquete como um ícone no item de menu:fonte
Se sua imagem estiver armazenada em um ResourceDictionary, você poderá fazê-lo com apenas uma linha de código:
fonte
Também há uma maneira mais simples. Se a imagem for carregada como um recurso no XAML e o código em questão for o code-behind desse conteúdo XAML:
fonte
Coloque o quadro em um VisualBrush:
Coloque o VisualBrush em GeometryDrawing
Agora coloque o GeometryDrawing em um DrawingImage:
Coloque isso na sua fonte da imagem e pronto!
Você poderia fazer isso muito mais fácil:
E no código:
fonte
Também há uma maneira mais simples. Se a imagem é carregada como um recurso no XAML e o código em questão é o código por trás desse XAML:
Aqui está o dicionário de recursos para um arquivo XAML - a única linha com a qual você se importa é o ImageBrush com a chave "PosterBrush" - o restante do código é apenas para mostrar o contexto
Agora, no código por trás, você pode fazer isso
fonte
Como carregar uma imagem incorporada em ícones e imagens de recursos (versão corrigida do Arcturus):
Suponha que você queira adicionar um botão com uma imagem. O que você deveria fazer?
Agora é hora de carregar nossa imagem em XAML
Feito.
fonte
Eu sou novo no WPF, mas não no .NET.
Passei cinco horas tentando adicionar um arquivo PNG a um "Projeto de Biblioteca de Controle Personalizado WPF" no .NET 3.5 (Visual Studio 2010) e definindo-o como plano de fundo de um controle herdado de imagem.
Nada em relação aos URIs funcionou. Não consigo imaginar por que não existe um método para obter um URI de um arquivo de recurso, por meio do IntelliSense, talvez como:
Eu tentei muitos URIs e joguei com o ResourceManager e os métodos GetManifest do Assembly, mas todos foram exceções ou valores NULL.
Aqui eu potei o código que funcionou para mim:
fonte
Se você já possui um fluxo e conhece o formato, pode usar algo como isto:
fonte
Você perdeu um pouco.
Para obter um recurso incorporado de qualquer assembly, você deve mencionar o nome do assembly com o nome do arquivo, conforme mencionado aqui:
fonte