2011-04-26 6 views
10

리소스 관리를 위해 .resx 파일을 사용하는 C# WPF 응용 프로그램에서 작업하고 있습니다. 자, 프로젝트에 아이콘 (.ico)을 추가하려고하는데 몇 가지 문제가 있습니다.xaml에서 .resx 파일 안의 아이콘을 참조하는 방법은 무엇입니까?

<Image Name="imgMin" Grid.Column="0" 
     Stretch="UniformToFill" 
     Cursor="Hand" 
     MouseDown="imgMin_MouseDown"> 
    <Image.Style> 
     <Style TargetType="{x:Type Image}"> 
      <Setter Property="Source" Value="\Images\minimize_glow.ico"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Source" Value="\Images\minimize_glow.ico"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 

이 잘 작동하지만 내가 AppResources.resx로 아이콘을 이동하면 내가 XAML 코드를 참조 문제로 실행. 위의 Setter Property = ... 행 대신에 무엇을 사용해야합니까? 이 :

<Setter Property="Source" Value="{x:Static res:AppResources.minimize}"/> 

는 내가 아마 값이 아이콘하지만 지금은 아이콘 자체를 가리키는 문자열이 아니기 때문에 "소스"는 다른 속성을 사용할 필요가 있다고 생각, 작동하지 않습니다. 나는 어느 쪽을 사용하는지 알아낼 수 없다 - 약간의 도움, 제발?

답변

3

속성 Source 속성은 문자열을 "원"하지 않으며, 문자열을 얻는 즉시 변환합니다. 리소스에 아이콘을 추가하면 System.Drawing.Icon이됩니다. 변환기를 통해 ImageSource으로 변환해야합니다.

리소스에 정적으로 액세스 할 수 있지만 예상되는 구문 x:Static을 준수해야합니다.

xmlns:prop="clr-namespace:Test.Properties" 
<Image MaxHeight="100" MaxWidth="100"> 
    <Image.Source> 
     <Binding Source="{x:Static prop:Resources.icon}"> 
      <Binding.Converter> 
       <vc:IconToImageSourceConverter/> 
      </Binding.Converter> 
     </Binding> 
    </Image.Source> 
</Image> 
public class IconToImageSourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var icon = value as System.Drawing.Icon; 
     var bitmap = icon.ToBitmap(); 

     //http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/1069509#1069509 
     MemoryStream ms = new MemoryStream(); 
     bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
     ms.Position = 0; 
     BitmapImage bi = new BitmapImage(); 
     bi.BeginInit(); 
     bi.StreamSource = ms; 
     bi.EndInit(); 

     return bi; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

참고 : 이미지는 "이미지"로 추가하면

  • 자원 액세스 한정자는
  • 공개합니다 당신은 Bitmap 대신에 결국 다른 변환기가 필요한 아이콘
+0

매우 유용합니다 ... 제 생각에. 이제 오류 메시지가 나타납니다. 알 수없는 빌드 오류입니다. '키는 null 일 수 없습니다. 매개 변수 이름 : 키 라인 131 위치 34. ' 바인딩 소스를 가리키는 "{x : 정적 해상도 : AppResources.minimize}" – Swooper

+0

흠, 어떤 문제가 발생하지 않았는지 궁금합니다. –

+0

중요한 점 중 하나는 리소스 액세스 수정자가 공개 된 것입니다. 내부와는 반대로, 당신이 가지고있는 것과는 다른 예외를 던집니다. –

관련 문제