Цветовая привязка прямоугольника WPF - PullRequest
1 голос
/ 01 апреля 2011

Я пытаюсь написать сетку прямоугольников, которая меняет цвет своих объектов.

  private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < size; i++)
        {
            main_grid.ColumnDefinitions.Add(new ColumnDefinition());
            main_grid.RowDefinitions.Add(new RowDefinition());
        }
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cells[i, j] = new Cell { state = false, col = false };
                Rectangle rect = new Rectangle();
                Grid.SetColumn(rect, j);
                Grid.SetRow(rect, i);
                rect.Fill = Brushes.Orange;
                rect.DataContext = cells[i, j];
                rect.SetBinding(OpacityProperty, "ev_opacity");
                Binding binding = new Binding("ev_col");
                binding.Converter = new BooleanToBrushConverter();
                rect.SetBinding(Rectangle.FillProperty, binding);
                main_grid.Children.Add(rect);
            }
        }
        setupTimer();
    }

Как установить цвет прямоугольника в зависимости от col? (например: true - черный, false - белый)

Класс сотовой связи:

class Cell : INotifyPropertyChanged
    {
        private bool _state;
        private bool _Col;
        public event PropertyChangedEventHandler PropertyChanged;
        public event PropertyChangedEventHandler PropertyChanged2;
        public bool Col; //to set color
        {
            get
            {
                return _Col;
            }
            set
            {
                _Col = value;
                if (PropertyChanged2 != null)
                {
                    PropertyChanged2(this, new PropertyChangedEventArgs("event2"));
                };  
            }
        }
        public bool state //to set opacity
        {
            get
            {
                return _state;
            }
            set
            {
                _state = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("ev_opacity"));
                };
            }
        }
        public static implicit operator int(Komorka c)
        {
            return Convert.ToInt32(c.state);
        }
    }

Edit: Этот код не работает - после запуска ничего не произойдет, если я нажму на сетку.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2011

Обычный способ - использовать ValueConverter для привязки.

Просто создайте ValueConverter, который преобразует логическое значение в Brush.

В WPF вы также можете использовать DataTrigger в шаблоне ячейки, если у вас есть CellControl.

РЕДАКТИРОВАТЬ

Чтобы добавить привязку в коде:

    Binding binding = new Binding("State");
    binding.Converter = new BooleanToBrushConverter();
    _rectangle.SetBinding(Rectangle.FillProperty, binding);
0 голосов
/ 03 апреля 2011

привязки:

my_rect.SetBinding(Rectangle.OpacityProperty, "state_opacity");
my_rect.SetBinding(Rectangle.FillProperty,
                     new Binding()
                     {
                         Converter = new BooleanToBrushConverter(),
                         Path = new PropertyPath("state_color")
                     }
                  );

Сотовый класс. Изменение цвета прямоугольников зависит от переменной state_color.

class Komorka : INotifyPropertyChanged
    {
        private bool _state_opacity;
        private bool _state_color;

        public event PropertyChangedEventHandler PropertyChanged;

        public bool state_color
        {
            get { return _state_color; }
            set
            {
                _state_color = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("state_color"));
                }; 
            }
        }

        public bool state_opacity
        {
            get
            {
                return _state_opacity;
            }
            set
            {
                _state_opacity = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("state_opacity"));
                };
            }
        }
    }
}

Класс преобразователя:

class BoolToBrush : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                if ((bool)value == false)
                {
                    return new SolidColorBrush(Colors.Orange);
                }
                else
                {
                    return new SolidColorBrush(Colors.Black);
                }
            }
            else
            {
                return new SolidColorBrush(Colors.Red);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...