2012-04-11 1 views
1

특정 조건에 따라 여러 아이콘 크기를 허용하려고합니다. 이렇게하려면 번치 폴더가 있습니다 : 'Images \ Icons \ ... \ *. png'... 여기서 크기는 (16, 32, 64, 128, 256 등)입니다. 각 폴더에는 지정된 크기에 최적화 된 아이콘.StringFormat과 XAML 바인딩을 사용하여 이미지 경로에 폴더 삽입

나는 이미지 소스 경로에서 폴더 ... 즉 지정할 수없는 것

내 문제 : 할 것입니다 (지금은

<Image x:Name = "img" 
     Stretch = "None" 
     Source = "{Binding StringFormat=Images\Icons\{0}\Multi.png, 
        RelativeSource={RelativeSource Self}, 
        Path=Parent.Parent.Tag}" /> 

, 난 그냥 조부모의 태그에 폴더 이름을 저장하고 있습니다를 미래에 다른 것에 구속력을 가졌지 만, 지금은이 비트를 하나로 합치려고 노력하고 있습니다). 나는 위의 XAML을 구축 할 때, 나는 오류가 발생 : 이것은보고 있다고 beleave하는 날 리드

The text \Multi.png ... is not allowed after the closing } of a markup extension. 

은 {0} 대신 내 문자열 형식의 일부가되는 마크 업 확장으로. 나는 {와 탈출} 및 문자열 형식을 지정하기 위해 작은 따옴표를 사용하는 방법에 대한 읽을 수 있지만 한 어느 작품 :

Source = "{Binding StringFormat={}Images\Icons\{0}\Multi.png, ... 

위의 수익률을 나는 전혀 탈출하지 않는 경우와 같은 오류 ..

Source = "{Binding StringFormat='Images\Icons\{0}\Multi.png', ... 

Source = "{Binding StringFormat='{}Images\Icons\{0}\Multi.png', ... 

위의 두 가지는 오류가 발생하는 것을 방지하지만 이미지 원본이 null이됩니다.

누구나이 방법을 알고 있습니까?

(조부모의 태그가 '16'으로 설정되어 있으면 이미지 소스를 Images \ Icons \ 16 \ Multi.png에 바인딩하고 싶습니다. ... 태그가 '32'로 설정된 경우 소스를 Images \ Icons \ 32 \ Multi.png에 바인딩해야합니다. 테스트에서 조부모 태그를 전체 경로로 설정하고 문자열 형식을 제외 시켰습니다. 조부모 태그에 대한 상대적 바인딩이 성공하고 이미지가 표시되었습니다. 나머지 경로를 지정하기 위해 문자열 형식으로 폴더 이름 만 지정하려고하면 오류가 발생합니다.

답변

3

Binding의 StringFormatter 속성은 대상이 String 유형 인 경우에만 작동합니다. 그렇지 않으면 무시됩니다.

바인딩을 변환기에 추가하여 형식 문자열과 태그를 가져 와서 서식을 적용하고이를 ImageSource로 변환하여이 문제를 해결할 수 있습니다. 당신이 당신의 컨버터를했으면

public sealed class ImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
          object parameter, CultureInfo culture) 
    { 
     if (parameter == null || parameter.Equals(String.Empty)) parameter = "{0}"; 
     string path = String.Format((string) parameter, value); 
     return new BitmapImage(new Uri(path)); 
    } 

    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

, 당신은 XAML에서 리소스에 다음을 추가 할 수 있습니다 :

<local:ImageConverter x:Key="ImageConverter" /> 

그리고 당신의 소스에 바인딩을 수정 C#에서, 당신의 컨버터는 같이 보일 것입니다 :

<Image x:Name="img" 
     Stretch="None" 
     Source="{Binding Parent.Parent.Tag, Converter={StaticResource ImageConverter}, 
         ConverterParameter='Images\\Icons\\{0}\\Multi.png', 
         RelativeSource ={RelativeSource Mode=Self}}" 
/> 
+0

필자는 {} {0}의 문자열 형식을 사용하여 태그에 바인딩하고 전체 경로로 태그를 설정하면 잘 바인딩합니다. 이 기능적으로 stringformat을 사용하여 경로에 폴더를 삽입하는 것과 같지 않습니까? 그것은 당신이 말했듯이 문자열에서 ImageSurce로 자동으로 변환되는 문자열로 변환됩니다. 나는 문제가 마크 업 확장의 {0}을 닫는 것으로 보았다는 것입니다 ... 아니면 나는 단지 틀린 것입니다 (이는 아마도 xaml에 비교적 익숙하기 때문에 가능합니다). – Chronicide

+0

@ Chronicide 나는 내가 가지고있는 버그 중 일부를 수정 한 코드를 약간 수정했다. 나는 그것이 작동하는지 확인하기 위해 그것을 테스트했다. –

+0

글쎄, 나는 많은 시험을 해봤고, 당신의 설명을 확인했다.그것은 문자열 형식을 완전히 무시하고있는 것으로 밝혀졌습니다 ... 그것은 태그가 전체 경로를 가졌을 때 항상 작동하는 이유였습니다. 문자열 형식으로 작업 한 텍스트 속성을 바인딩 할 때 비슷한 작업을 수행합니다. 내가 그 일을 결코 해낼 수 없었기 때문에 당신의 도움에 감사드립니다. 또한 코드를 주셔서 감사합니다. 나는 변환기를 피하기를 희망했지만 작동한다. – Chronicide

관련 문제