Привязать метку Foreground к переменной - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть 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 ]

2 голосов
/ 28 декабря 2011

Просто глядя на код 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 голос
/ 29 декабря 2011

Если вы устанавливаете 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");
                }
            }
        }
    }
}

Что касается нацеливания на все метки в вашем приложении, правильный подход заключается в использовании стиля, как предлагалось ранее.Вы должны будете применить этот стиль к каждому лейблу.Пропустите клавишу x: чтобы сделать стиль по умолчанию для ваших ярлыков

    <Style x:Key="LabelForeGroundStyle" TargetType="{x:Type Label}">
         <Setter Property="Foreground" Value="{Binding defColor}" />
    </Style> 
1 голос
/ 28 декабря 2011

Вместо привязки каждой метки к одному и тому же свойству, я думаю, вам следует использовать стиль и применять этот стиль для каждой метки, например, с вашей привязкой:

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

или дажелучше с триггером :

<Style.Triggers>
 <Trigger>
   <Trigger Property="Background" Value="Blue">
     <Setter Property="Foreground" Value="Green"/>
   </Trigger>
 </Trigger>
</Style.Triggers>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...