2011-12-16 3 views
22

WPF 응용 프로그램에서 작업하고 있습니다. 내 텍스트 블록을 제 단추에 바인딩했습니다. 관련 버튼의 isEnabled가 true 일 때 내 텍스트 블록의 전경을 검정색으로 설정하려고합니다. 변환기를 사용하여이 작업을 수행하려고합니다. 하지만 작동하지 않습니다. 또한 오류를주지 않습니다. "Model"폴더에서 다음과 같은 클래스를 선언했습니다.XAML의 부울과 색상 변환기 사용

public class BrushColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if ((bool)value) 
     { 
      { 
       return System.Windows.Media.Colors.Black; 
      } 
     } 
     return System.Windows.Media.Colors.LightGreen; 
    } 

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

버튼의은 (예를 들어 RaiseCanExecuteChanged를 사용하여)의 ViewModel에서 isable 속성 변경()) XAML에서

TextBlock에 관련된 일들은 사용 :

<Window.Resources> 
      <local:BrushColorConverter x:Key="BConverter"></local:BrushColorConverter> 
    </Window.Resources> 
<Button>(!..all button properties..!)</Button> 
    <TextBlock x:Name="AnswerText"           
       Text="Answer"           
       Foreground="{Binding ElementName=AnswerButton,Path=IsEnabled, Converter={StaticResource BConverter}}" 
       TextWrapping="Wrap"/> 
+0

문자열을 반환 사용해보십시오.Black.ToString()' – sll

+0

빙고 .. 좋아요. 감사. – deathrace

답변

33

사용은 새로운 SolidColorBrush를 반환 (색상 .검은);

+0

감사합니다. 더 정확합니다. 'string'을 반환하는 대신 색상을 직접 반환 할 수 있기 때문입니다. – deathrace

13

위의 대답은 변환기를 올바르게 사용하는 방법을 보여줍니다. 그러나 변환기를 사용해야합니까? 첫 번째 TextBlockDataTrigger를 사용하여 부모의 IsEnabled 속성에 바인딩,

XAML 위의 예에서

 <StackPanel> 

      <Button IsEnabled="{Binding ElementName=isEnabledCheckBox, Path=IsChecked}"> 
       <TextBlock Text="Answer" TextWrapping="Wrap"> 
        <TextBlock.Style> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsEnabled}" Value="True"> 
            <Setter Property="Foreground" Value="Green"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </TextBlock.Style> 
       </TextBlock> 
      </Button> 

      <Button IsEnabled="{Binding ElementName=isEnabledCheckBox, Path=IsChecked}"> 
       <TextBlock Text="Answer" TextWrapping="Wrap"> 
        <TextBlock.Style> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Style.Triggers> 
           <Trigger Property="IsEnabled" Value="True"> 
            <Setter Property="Foreground" Value="Green"/> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </TextBlock.Style> 
       </TextBlock> 
      </Button> 

      <CheckBox x:Name="isEnabledCheckBox" Content="Toggle IsEnable on Buttons above" /> 

     </StackPanel> 

, 일부 색상의 경우에 Foreground을 설정 :이은 Triggers를 사용하여 XAML에서 할 수 있습니다 그건 진실이야.

그러나 이것은 과도합니다. IsEnabled 속성은 WPF에 의해 자동으로 자식에게 전파됩니다. 즉, Button에서 IsEnabled을 false로 설정하면 TextBlockIsEnabled 속성이 자동으로 false로 업데이트됩니다. 이는 두 번째 TextBlock에서 Trigger 속성을 사용하여 자신의 IsEnabled 속성을 true 값 (해당 IsEnabled 속성은 부모와 동일하므로)에서 확인합니다. 이것이 바람직한 접근 방법이 될 것입니다.

희망이 도움이됩니다.

+0

이것은 또한 훌륭한 작품입니다. 이전에 같은 방법을 시도했지만 부모에게 묶을 수 없었습니다. 그러나 친척 원이 그 문제를 해결할 것입니다. 감사. – deathrace

4

이 컨버터를 일반화하려면 value이 true 또는 false 일 때 삽입 할 색상을 지정하는 데 ConverterParameter을 사용할 수 있습니다. 또한 불투명도가 중요 할 수 있습니다. 나는 여기서 [ColorNameIfTrue; ColorNameIfFalse; OpacityNumber] 매개 변수를 취하는 Converter를 제공한다.

@ user1101511에 언급 된 SolidColorBrush() 메서드는 System.Windows.Media 라이브러리의 일부이므로 동일한 라이브러리의 Color 형식을 사용합니다. 이 유형에는 System.Drawing.Color 클래스와 같은 Color.FromName() 메소드가 없습니다.

저는 도우미 메서드 ColorFromName(string name)을 만들었습니다. ConverterParameter의 인터렉션이 실패 할 경우 "LimeGreen"을 대체 색상으로 지정합니다. 제 경우에는 value이 거짓 일 때 출력은 "Transparent"이됩니다.

using System; 
using System.Globalization; 
using System.Windows.Data; 
using System.Windows.Media; 

namespace MyConverters 
{ 
    [ValueConversion(typeof(bool), typeof(SolidColorBrush))] 
    class BoolToColorBrushConverter : IValueConverter 
    { 
     #region Implementation of IValueConverter 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="value">Bolean value controlling wether to apply color change</param> 
     /// <param name="targetType"></param> 
     /// <param name="parameter">A CSV string on the format [ColorNameIfTrue;ColorNameIfFalse;OpacityNumber] may be provided for customization, default is [LimeGreen;Transperent;1.0].</param> 
     /// <param name="culture"></param> 
     /// <returns>A SolidColorBrush in the supplied or default colors depending on the state of value.</returns> 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     SolidColorBrush color; 
     // Setting default values 
     var colorIfTrue = Colors.LimeGreen; 
     var colorIfFalse = Colors.Transparent; 
     double opacity = 1; 
     // Parsing converter parameter 
     if (parameter != null) 
     { 
      // Parameter format: [ColorNameIfTrue;ColorNameIfFalse;OpacityNumber] 
      var parameterstring = parameter.ToString(); 
      if (!string.IsNullOrEmpty(parameterstring)) 
      { 
       var parameters = parameterstring.Split(';'); 
       var count = parameters.Length; 
       if (count > 0 && !string.IsNullOrEmpty(parameters[0])) 
       { 
        colorIfTrue = ColorFromName(parameters[0]); 
       } 
       if (count > 1 && !string.IsNullOrEmpty(parameters[1])) 
       { 
        colorIfFalse = ColorFromName(parameters[1]); 
       } 
       if (count > 2 && !string.IsNullOrEmpty(parameters[2])) 
       { 
        double dblTemp; 
        if (double.TryParse(parameters[2], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture.NumberFormat, out dblTemp)) 
         opacity = dblTemp; 
       } 
      } 
     } 
     // Creating Color Brush 
     if ((bool) value) 
     { 
      color = new SolidColorBrush(colorIfTrue); 
      color.Opacity = opacity; 
     } 
     else 
     { 
      color = new SolidColorBrush(colorIfFalse); 
      color.Opacity = opacity; 
     } 
     return color; 
    } 


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

    #endregion 

    public static Color ColorFromName(string colorName) 
    { 
     System.Drawing.Color systemColor = System.Drawing.Color.FromName(colorName); 
     return Color.FromArgb(systemColor.A, systemColor.R, systemColor.G, systemColor.B); 
    } 
} 

는 XAML에서 위의 컨버터는 다음과 같이 사용할 수있다 :`System.Windows.Media.Colors :

Background="{Binding MyBooleanValue, Converter={StaticResource BoolToColorBrushConverter}, ConverterParameter=LimeGreen;Transperent;0.2, Mode=OneWay}"