WPF 이미지 리소스 저장
설명을 위해 10~20개의 작은 아이콘과 이미지를 필요로 하는 WPF 어플리케이션의 경우 이를 어셈블리에 내장된 리소스로 저장하는 것이 올바른 방법입니까?
이 경우 이미지 컨트롤이 내장된 리소스에서 이미지를 로드하도록 XAML에서 지정하는 방법은 무엇입니까?
이미지를 여러 곳에서 사용하는 경우 이미지 데이터를 메모리에 한 번만 로드한 후 공유합니다.Image
요소들.
이를 수행하려면 를 리소스로 만듭니다.
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
그런 다음 코드에서 다음과 같은 것을 사용합니다.
<Image Source="{StaticResource MyImageSource}" />
제 경우엔, 제가 이 비디오의Image.png
빌드 액션을 실시하기 위한 파일Resource
뿐만 아니라Content
그러면 이미지가 컴파일된 어셈블리 내에 저장됩니다.
이미지, 비디오 등을 사용하는 베스트 프랙티스는 다음과 같습니다.
- 파일 "빌드 작업"을 "내용"으로 변경합니다.Copy to build directory(빌드 디렉토리에 복사)를 선택해야 합니다.
- Solution Explorer 창의 "우클릭" 메뉴에 있습니다.
- 다음 형식의 이미지 소스:
- "/"My Assembly Name"; 컴포넌트/"Your Path / / [ Your Image . png ]
예
<Image Source="/WPFApplication;component/Images/Start.png" />
이점:
- 파일이 어셈블리에 포함되어 있지 않습니다.
- 리소스 관리자가 너무 많은 리소스로 인해 메모리 오버플로 문제를 일으킵니다(빌드 시).
- 어셈블리 간에 호출할 수 있습니다.
어떤 사람들은 답을 얻지 못한 채 암호로 이것을 하는 것에 대해 묻고 있다.
오랜 시간 동안 검색한 결과 매우 간단한 방법을 찾았는데, 아무런 예도 찾을 수 없었기 때문에 여기에서 이미지로 작동하는 내 방법을 공유합니다.(저는 .gif였습니다)
요약:.
ImageSource "destinations"가 좋아하는 비트맵 프레임을 반환합니다.
용도:
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);
}
학습 내용:
경험상 팩 문자열은 문제가 되지 않습니다.스트림을 체크해 주세요.특히 처음 읽었을 때 포인터가 파일 끝에 설정되어 있고 다시 읽기 전에 포인터를 제로로 재설정해야 합니다.
이것으로 이 작품이 갖고 싶었던 많은 시간을 절약할 수 있기를 바랍니다!
실행 어셈블리에 리소스를 로드하기 위한 코드 내 이미지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 이미지가 프로젝트 속성에 리소스로 추가되었습니다.
- 리소스 폴더의 새 파일이 자동으로 생성됩니다.
- 빌드 작업을 리소스로 설정합니다.
이 방법은 효과가 있었습니다.
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
Blend를 사용하는 경우 Source 속성의 올바른 경로를 쉽게 얻을 수 있도록 Project 패널에서 이미지를 디자이너로 드래그 앤 드롭하기만 하면 됩니다.
네, 맞습니다.다음 경로를 사용하여 리소스 파일의 이미지를 사용할 수 있습니다.
<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>
다음은 Drew Noakes의 답변을 바탕으로 리소스 사전을 만들고, 여기에 비트맵 이미지 리소스를 추가하고, 사용자 컨트롤에서 비트맵 이미지 리소스를 참조하기 위해 수행한 전체 단계입니다.
Images
폴더는 프로젝트 루트에 있습니다.MyImage.png
Images
더입니니다다- 서서
MyImage.png
[ ]에서 [Set ], [Set ]를 선택합니다.Build Action
로로 합니다.Resource
. - 를 만듭니다.이 이름은 다음과 같습니다.
MainResourceDictionary.xaml
:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<BitmapImage x:Key="MyImageSource" UriSource="Images/MyImage.png" />
</ResourceDictionary>
- 컨트롤의 리소스 사전에 참조를 추가합니다.
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MainResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
...
- 컨트롤에서 이미지 리소스를 참조합니다.
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MainResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
...
<Image Source="{DynamicResource ResourceKey=ServiceLevel1Source}" />
...
다음 작업이 수행되었으며 설정할 이미지는 속성의 리소스입니다.
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/storing-wpf-image-resources
'programing' 카테고리의 다른 글
클라이언트 IP 주소의 최대 길이 (0) | 2023.04.10 |
---|---|
키/값 쌍의 파일에서 환경 변수 설정 (0) | 2023.04.10 |
라벨 콘텐츠의 WPF 문자열 형식 (0) | 2023.04.10 |
Excel 시리얼 날짜 번호를 로 변환하려면 어떻게 해야 하나요?NET 날짜 시간? (0) | 2023.04.10 |
데이터베이스 전체 SQL-Server 스크립팅 (0) | 2023.04.10 |