2011-12-16 17 views
22

Tôi đang làm việc trên ứng dụng WPF. Tôi đã chặn khối chữ của mình vào nút của tôi. Tôi muốn thiết lập foreground của textblock của tôi thành màu đen khi nút được kết hợp của nó isEnabled là true. Tôi muốn thực hiện việc này bằng trình chuyển đổi. Nhưng không hoạt động. cũng không đưa ra bất kỳ lỗi nào. Tôi đã khai báo lớp sau trong thư mục "Mô hình" của mình.sử dụng công cụ chuyển đổi boolean thành màu trong 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(); 
    } 
} 

Button enable, thay đổi sở hữu isable từ viewmodel (ví dụ sử dụng RaiseCanExecuteChanged)())

điều TextBlock liên quan trong XAML là:

<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

Thử trở về chuỗi: 'System.Windows.Media.Colors.Black.ToString() ' – sll

+0

Bingo .. thats tuyệt vời. Cảm ơn. – deathrace

Trả lời

33

sử dụng trở SolidColorBrush mới (Màu sắc .Đen);

+0

Cảm ơn. đó là chính xác hơn, vì tôi có thể trả lại màu trực tiếp thay vì trả về 'chuỗi'. – deathrace

13

Câu trả lời ở trên cho bạn thấy cách bạn sử dụng trình chuyển đổi một cách chính xác. Tuy nhiên, bạn có thực sự cần phải sử dụng một công cụ chuyển đổi? Điều này có thể được thực hiện trong XAML chỉ sử dụng Triggers:

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> 

Trong ví dụ trên, TextBlock đầu tiên liên kết với các tài sản IsEnabled mẹ của nó bằng cách sử dụng một DataTrigger, và đặt Foreground đến một số màu sắc nếu đúng rồi.

Tuy nhiên, đây là quá mức cần thiết - thuộc tính IsEnabled được tự động truyền cho trẻ em bằng WPF. Tức là, nếu bạn đặt IsEnabled thành false trên số Button, thì TextBlock của bạn sẽ có thuộc tính IsEnabled được cập nhật thành sai tự động. Điều này được thể hiện trong số TextBlock thứ hai sử dụng thuộc tính Trigger để kiểm tra thuộc tính IsEnabled của chính nó so với giá trị của true (vì thuộc tính IsEnabled của nó sẽ giống như thuộc tính của cha mẹ). Đây sẽ là cách tiếp cận ưa thích.

Hy vọng điều này sẽ hữu ích!

+0

đây cũng là một công việc tuyệt vời. Tôi đã thử trước đó nhưng tôi đã không thể liên kết với cha mẹ của nó. Nhưng người thân sẽ giải quyết vấn đề đó. Cảm ơn. – deathrace

4

Để biến công cụ này thành tổng quát, bạn có thể sử dụng ConverterParameter để chỉ định màu cần chèn vào khi value đúng hoặc sai. Ngoài ra độ mờ có thể được quan tâm. Tôi ở đây cung cấp các chuyển đổi tôi lấy tham số [ColorNameIfTrue; ColorNameIfFalse; OpacityNumber].

Vì phương pháp SolidColorBrush() được đề cập bởi @ user1101511 là một phần của thư viện System.Windows.Media, nó sử dụng loại Color từ cùng một thư viện đó. Loại này không có phương thức Color.FromName(), chẳng hạn như lớp System.Drawing.Color.

Do đó tôi đã thực hiện phương thức trợ giúp được gọi là ColorFromName(string name). Tôi chỉ định "LimeGreen" làm màu dự phòng nếu sự cố kết hợp của ConverterParameter không thành công. Trong trường hợp của tôi, tôi muốn đầu ra là "Transparent" khi value là sai.

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); 
    } 
} 

Từ XAML bộ chuyển đổi trên có thể được sử dụng như thế này:

Background="{Binding MyBooleanValue, Converter={StaticResource BoolToColorBrushConverter}, ConverterParameter=LimeGreen;Transperent;0.2, Mode=OneWay}" 
Các vấn đề liên quan