WPF 이미지 리소스
나는 주로 웹과 약간의 Windows Forms 배경에서 왔습니다. 새 프로젝트에서는 WPF를 사용합니다. WPF 응용 프로그램에는 설명을 위해 10-20 개의 작은 아이콘과 이미지가 필요합니다. 어셈블리에 이러한 리소스를 포함 된 리소스로 저장하려고합니다. 그것이 올바른 길입니까?
XAML에서 이미지 컨트롤이 포함 된 리소스에서 이미지를로드하도록 지정하려면 어떻게해야합니까?
여러 곳에서 이미지를 사용하는 경우 이미지 데이터를 메모리에 한 번만로드 한 다음 모든 Image
요소 간에 공유하는 것이 좋습니다.
이렇게하려면 BitmapSource
어딘가에 리소스를 작성하십시오 .
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
그런 다음 코드에서 다음을 사용하십시오.
<Image Source="{StaticResource MyImageSource}" />
필자의 경우 Image.png
파일을 Resource
단순한 빌드 작업이 아닌 빌드 작업으로 설정해야한다는 것을 알았습니다 Content
. 이렇게하면 이미지가 컴파일 된 어셈블리 내로 전달됩니다.
이미지, 비디오 등을 사용하는 가장 좋은 방법은 다음과 같습니다.
- 파일 "Build action" 을 "Content"로 변경하십시오 . 빌드 디렉토리로 복사를 확인하십시오 .
- 솔루션 탐색기 창의 "오른쪽 클릭"메뉴에 있습니다.
- 다음 형식의 이미지 소스 :
- "/ «YourAssemblyName» ; component /«YourPath»/«YourImage.png» "
예
<Image Source="/WPFApplication;component/Images/Start.png" />
혜택:
- 파일은 어셈블리에 포함되지 않습니다.
- 리소스 관리자는 너무 많은 리소스 (빌드 타임에)로 메모리 오버플로 문제를 일으 킵니다.
- 어셈블리간에 호출 할 수 있습니다.
어떤 사람들은 코드 에서이 작업을 수행하고 답변을 얻지 못하고 있습니다.
많은 시간을 검색 한 후 매우 간단한 방법을 찾았고 예를 찾지 못했기 때문에 이미지와 작동하는 광산을 공유했습니다. (광산은 .gif였습니다)
요약:
ImageSource "목적지"가 좋아하는 BitmapFrame을 반환합니다.
사용하다:
doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");
방법:
static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
return BitmapFrame.Create(oUri);
}
학습 :
내 경험에 따르면 팩 문자열이 문제가되지 않으므로 스트림을 확인하십시오. 특히 처음 읽을 때 포인터가 파일의 끝 부분에 포인터를 설정하고 다시 읽기 전에 0으로 다시 설정 해야하는 경우.
나는 이것이 당신이이 작품이 저를 위해 원하는 많은 시간을 절약하기를 바랍니다!
내 이미지 Freq.png
가 폴더에 Icons
있고 다음과 같이 정의 된 실행중인 어셈블리에 리소스를로드하는 코드에서 Resource
:
this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/"
+ Assembly.GetExecutingAssembly().GetName().Name
+ ";component/"
+ "Icons/Freq.png", UriKind.Absolute));
또한 기능을 만들었습니다.
/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
if (assembly == null)
{
assembly = Assembly.GetCallingAssembly();
}
if (pathInApplication[0] == '/')
{
pathInApplication = pathInApplication.Substring(1);
}
return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute));
}
사용법 (ResourceHelper 클래스에 함수를 넣었다고 가정) :
this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");
참고 : WPF의 MSDN Pack URI를 참조하십시오 .
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
그렇습니다.
경로를 사용하여 리소스 파일에서 이미지를 사용할 수 있습니다.
<Image Source="..\Media\Image.png" />
이미지 파일의 빌드 조치를 "자원"으로 설정해야합니다.
리소스 사용 방법에 대한 자세한 설명 : WPF 응용 프로그램 리소스, 콘텐츠 및 데이터 파일
그리고 그것들을 참조하는 방법은 "Pack URIs in WPF"를 읽으십시오.
요컨대, 참조 / 참조 어셈블리에서 리소스를 참조 할 수있는 수단도 있습니다.
- Visual Studio 2010 Professional SP1
- .NET Framework 4 클라이언트 프로파일.
- 프로젝트 속성에 리소스로 추가 된 PNG 이미지.
- Resources 폴더에 새 파일이 자동으로 생성됩니다.
- 조치 세트를 자원으로 빌드하십시오.
이것은 나를 위해 일했다 :
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
당신이 사용하는 경우 혼합을 , 추가 쉽게 그것을 확인하고 문제가에 대한 올바른 경로를 받고 있지하는 소스 속성 드래그하고 디자이너로 프로젝트 패널에서 이미지를 놓습니다.
예, 그렇습니다. 경로를 사용하여 리소스 파일에서 이미지를 사용할 수 있습니다.
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
<Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
<TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>
다음은 작동하고 설정할 이미지는 속성의 리소스입니다.
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;
참고 URL : https://stackoverflow.com/questions/347614/wpf-image-resources
'development' 카테고리의 다른 글
콘솔에서 AngularJS 서비스를 테스트하려면 어떻게해야합니까? (0) | 2020.02.23 |
---|---|
bash 스크립트에서 첫 번째 인수를 제외한 모든 인수를 처리하십시오. (0) | 2020.02.23 |
정수 배열을 ASP.NET 웹 API에 전달 하시겠습니까? (0) | 2020.02.23 |
상각 상각 시간 (0) | 2020.02.23 |
파이썬에서 try-except-else를 사용하는 것이 좋은 습관입니까? (0) | 2020.02.23 |