2017-11-02 9 views
3

내 응용 프로그램 색상, 즉 텍스트의 색상, 구분 기호의 색상 및 배경의 색상을 고정 된 값으로 지정하려는 경우 사용할 때마다 동일한 색상을 입력하지 않으므로 필자는 개체 이름 (예를 들어 분리기), 내가 원하는 색상으로 변환 컨버터에 : 여기 IValueConverter 클래스의 내 구현의 :Xamarin.Forms의 변환기를 사용하여 텍스트를 컬러로 변환하는 방법은 무엇입니까?

class AppColorConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value is string) 
      { 
       var color = (string)value; 
       switch (color) 
       { 
        case "separator": 
         return Color.FromHex("c2bca8"); 
        case "text": 
         return Color.FromHex("96907e"); 
        default: 
         return Color.Default; 
       } 
      } 
      else 
       return null; 

     } 

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

하지만 데이터 바인딩 내 지식이 사용하지만 단순히 문자열을 color 속성에 전달하고 변환기에서 처리하려고하면 ResourceDictionary를 추가합니다.

<Controls:CustomPage.Resources> 
     <ResourceDictionary> 
      <Converters:AppColorConverter x:Key="colorConverter"/> 
     </ResourceDictionary> 
    </Controls:CustomPage.Resources> 
(210)

하지만 그것을 사용하는 방법이 작동하지 않습니다 : 컨버터를 사용하는 정적 자원 선언 :

<Label Text="English" VerticalOptions="CenterAndExpand" HorizontalOptions="EndAndExpand" TextColor="{separator, Converter=colorConverter}"/> 
+0

ConvertBack()에'반환 값;'을 추가하십시오. –

+0

올바른 바인딩 구문을 보려면 제 편집을 참조하십시오. –

답변

3

당신은이처럼있는 ResourceDictionary에 색상 값을 저장할 수 있습니다 :

<Color x:Key="ThemeBlue">#2499CE</Color> 

그런 다음 스위치 문에서이 구문을 사용 : 당신이 당신의 색상 값을 다시 사용할 수 있습니다

return Application.Current.Resources["ThemeBlue"]; 

그 방법을 사이트의 모든 변환기에서 사용할 수 있으며 ResourceDictionary 한 곳에서 관리 할 수 ​​있습니다.

편집

당신이 시도하는 것처럼 바인딩 할 수 있지만, 당신은 당신의 구문을 업데이트해야합니다. 이 시도 :

<Label Text="English" VerticalOptions="CenterAndExpand" HorizontalOptions="EndAndExpand" TextColor="{Binding ., Converter={StaticResource colorConverter}, ConverterParameter='separator'}" /> 

그리고 당신의 가치 컨버터

는 파라미터 객체 대신 값 객체를 사용 - 우리가이 예에서 매개 변수로 "분리"를 전달한다. 그러나이 방법은 권장하지 않습니다.

if (parameter is string) 
     { 
      var color = (string)parameter; 
      ... etc ... 

디에고의 스타일을 사용하는 아이디어가 가장 좋은 방법이라고 생각합니다.하지만이 질문에 답하고 테스트에서 작동합니다.

1

그것은 당신이 forgoten 한 단지 세부입니다. 당신은 스타일이 더 나은 접근 방식이라고 생각하지 않습니다, 당신의 시나리오에서, 그럼에도 불구하고

<Label Text="English" 
     VerticalOptions="CenterAndExpand" 
     HorizontalOptions="EndAndExpand" 
     TextColor="{separator, Converter={StaticResource colorConverter}}"/> 

: 여기

는 컨버터의 사용을 설정해야합니다 어떻게?

+0

스타일을 사용하는 것이 여기에 해당하는 것에 동의합니다. –

1

기본적으로 중괄호는 마크 업 확장자를 사용하고 있음을 나타 내기 때문에이 구문 {separator, Converter=colorConverter}을 사용할 수 없습니다.이 경우 마크 업 확장자를 상속 한 코드베이스에 separatorExtension이 있음을 의미하므로 속성 이름이 Converter이지만 UWP가 사용자 지정 태그 확장을 지원하지 않으므로이 옵션은 작동하지 않습니다. Binding 태그 확장을 사용하려고 할 경우 (변환기와 함께,이 코드는 {Binding separator, C....과 같아야합니다), 포함하는 DataContext에서 'separator'속성을 검색하려고하므로이 작업을 수행 할 수 없습니다 요소 (WPF에서는 정적 속성에 바인딩 할 수 있으므로 XAML의 어딘가에서 문자열 인스턴스를 만들고 정적으로 바인딩하여 변환기를 통해 사용할 수 있습니다 .UWP에서는이 작업을 수행 할 수 없습니다).따라서 유일한 방법은 David의 대답처럼 자원 접근 방식을 사용하고 {StaticResource MyColor} 구문을 통해 참조하는 것입니다.