将标签Foreground绑定到变量

时间:2011-12-28 17:39:15

标签: c# wpf binding wpf-controls

我有一个User Interface,我正在更改主网格的background属性。现在有些人给了一个非常好看的外观但是对于一些人来说,阅读显示的文本有困难。但是,当我现在有大约20个标签,并且每次更改并为它们分配颜色时,会出现问题,这使得我的代码看起来很难看。我知道必须有更优雅的设计。

我尝试将标签绑定到一种颜色,但这不起作用。这是代码

XAML:

<Label Foreground="{Binding defColor}" Content="Settings" Height="44" HorizontalAlignment="Left" Margin="12,53,0,0" Name="label1" VerticalAlignment="Top" FontWeight="Normal" FontSize="26" />

代码背后:

  SolidColorBrush defColor = new SolidColorBrush();

  public SettingsWindow()
  {
    InitializeComponent();
    defColor.Color = Colors.Black;
    //defColor.Color = Colors.Black;  label1.Foreground = defColor;
  }

  private void button4_Click(object sender, RoutedEventArgs e)
  {
   defColor.Color = Colors.Black;
  }

由于

3 个答案:

答案 0 :(得分:2)

只是看看你发布的C#代码,我认为你的第一个问题是你已经完成了这个

SolidColorBrush defColor = new SolidColorBrush(); 

而不是

public SolidColoRBrush defColor { get; set; }

您只能绑定到属性。

您的构造函数现在看起来像这样

public SettingsWindow()  
{  
    InitializeComponent();  
    defColor = new SolidColorBrush(Colors.Black);
    this.DataContext = this;  // need to tell your window where to look for binding targets
}  

答案 1 :(得分:1)

我认为您应该使用style,而不是将每个标签绑定到同一属性,并为每个标签应用此样式,例如你的装订:

  <Style x:Key="LabelForeGroundStyle" TargetType="{x:Type Label}">
    <Setter Property="Foreground" Value="{Binding defColor}" />
  </Style>

甚至更好,trigger

<Style.Triggers>
 <Trigger>
   <Trigger Property="Background" Value="Blue">
     <Setter Property="Foreground" Value="Green"/>
   </Trigger>
 </Trigger>
</Style.Triggers>

答案 2 :(得分:1)

如果您要设置SettingsWindow DataContext = this;那么SettingsWindow类必须实现INotifyPropertyChanged。让{Binding defColor}工作。您需要的代码:

public class SettingsWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public SettingsWindow()
    {
        // We are acting as our own 'ViewModel'
        DataContext = this;
        InitializeComponent();
    }

    private Color _defColor;
    public Color defColor
    {
        get { return _defColor; }
        set
        {
            if (_defColor != value)
            {
                _defColor = value;
                if(null != PropertyChanged)
                {
                    PropertyChanged(this, "defColor");
                }
            }
        }
    }
}

至于定位应用程序中的所有标签,正确的方法是使用Style,如前所述。 您必须将此样式应用于每个Label。省略x:键使其成为标签的默认样式

    <Style x:Key="LabelForeGroundStyle" TargetType="{x:Type Label}">
         <Setter Property="Foreground" Value="{Binding defColor}" />
    </Style>