将标签前台绑定到一个变量

本文关键字:一个 变量 标签 前台 绑定 | 更新日期: 2023-09-27 18:18:53

我有一个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;
  }

谢谢

将标签前台绑定到一个变量

就从你发布的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
}  

如果你正在设置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,如前所述。您必须将此样式应用于每个标签。省略x:键使其成为标签

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

与其将每个标签绑定到相同的属性,我认为你应该使用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>