Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как смена цвет родительскому контейнеру Grid? Не могу задать цвет дочерним контролам. 
V
    Опции темы
jenik15
Дата 12.12.2009, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Подскажите, как будет правильно сделать такую вещь на WPF.
У меня есть множество линий. Я их добавляю все на Grid. По нажатию кнопки хочу сменить цвет добавленных всех линий. Но сохранять коллекцию и перерисовывать ее снова я не хочу. То есть видимость добавленных линий у меня только в методе:

Код

private void AddLines()
{ 
var lines= GetLines(); 
Grid grid=new Grid();
grid.tag=1;
 foreach (var line in lines)
 {
                        Wpf.Line lineToAdd = new System.Windows.Shapes.Line();
                        lineToAdd.X1 = line.Point1.X;
                        lineToAdd.X2 = line.Point2.X;
                        lineToAdd.Y1 = line.Point1.Y;
                        lineToAdd.Y2 = line.Point2.Y;
                        lineToAdd.Stroke = System.Windows.Media.Brushes.Black;
                        lineToAdd.StrokeThickness = 1;
                        grid.Children.Add(lineToAdd);
 }
this.graphicOutput.Children.Add(grid);
}


Хочу сменить цвет всех добавленных линий без перебора коллекции, но к сожалению вижу, что нету у грида свойства Foreground:
Код

private void ChangeColor()
{ 
                        this.graphicOutput.
//Как можно дочерним контролам сменить цвет? 
}
 


Как можно сменить цвет родительскому Контролу, чтоб сменился он у всех дочерних (Не перебирая дочерних элементов).
PM MAIL   Вверх
tol05
Дата 12.12.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 3
Всего: 170



Цитата(jenik15 @  11.12.2009,  23:36 Найти цитируемый пост)
По нажатию кнопки хочу сменить цвет добавленных всех линий.

Цитата(jenik15 @  11.12.2009,  23:36 Найти цитируемый пост)
Как можно сменить цвет родительскому Контролу, чтоб сменился он у всех дочерних

С линиями все ясно... А с гридом - все-таки непонятно - нужно гриду-то цвет менять или нет?

Используйте для линий Binding, источником которого будет один какой-нибудь объект. Т.о. изменив свойство (в данном случае - цвет) этого объекта, все элементы через свои Bindings подхватят этот новый цвет.

Например, допустим, есть статический класс ColorHolder, у которого есть DependencyProperty ForeColorProperty типа Brush
тогда
Код

private void AddLines()
{ 
//*******************
ColorHolder.Instanse.ForeColor = System.Windows.Media.Brushes.Black;//ForeColor - CLR wrapper для свойства ForeColorProperty
Binding strokeBinding = new Binding("ForeColor") {Source = ColorHolder.Instance, Mode = BindingMode.OneWay};
//*******************
var lines= GetLines(); 
Grid grid=new Grid();
grid.tag=1;
 foreach (var line in lines)
 {
                        Wpf.Line lineToAdd = new System.Windows.Shapes.Line();

                        lineToAdd.SetBinding();
                        lineToAdd.X1 = line.Point1.X;
                        lineToAdd.X2 = line.Point2.X;
                        lineToAdd.Y1 = line.Point1.Y;
                        lineToAdd.Y2 = line.Point2.Y;
                        //*******************
                        //lineToAdd.Stroke = System.Windows.Media.Brushes.Black;
                        lineToAdd.SetBinding(Shape.StrokeProperty, strokeBinding); 
                        //*******************
                        lineToAdd.StrokeThickness = 1;
                        grid.Children.Add(lineToAdd);
 }
this.graphicOutput.Children.Add(grid);
}
...
//*******************
ColorHolder.Instanse.ForeColor = System.Windows.Media.Brushes.Red;
//*******************
 

как-то так




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
jenik15
Дата 12.12.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Спасибо за совет. Так и хочу теперь сделать, но возникло исключение и не могу разобраться, почему оно возникает.
 Значит цвет я буду брать с родительского грида:
Написал такой вот грид в который и буду добавлять дочерние линии. Добавил ему свойство ForeColor
Код

   public class GridEx:Grid
    {
        public System.Windows.Media.Brush ForeColor
        {
            get { return (System.Windows.Media.Brush)this.GetValue(BindColorProperty); }
            set { this.SetValue(BindColorProperty, value); }
        }

        public static readonly DependencyProperty BindColorProperty = DependencyProperty.Register(
          "ForeColor", typeof(System.Windows.Media.Brush), typeof(GridEx), new PropertyMetadata(false));
    }

А биндинг думаю делать так:
Код

GridEx grid = new GridEx();
      grid.SnapsToDevicePixels = true;
            foreach (var line in lines)
            {

                var lineToAdd = GetWpfLine(line.Point1, line.Point2);
                lineToAdd.SetBinding(Shape.StrokeProperty, 
                    new Binding("ForeColor") { Source = grid, Mode = BindingMode.OneWay });
                grid.Children.Add(lineToAdd);
            }

Но столкнулся с проблемой, что во время инициализации
Код

GridEx grid = new GridEx();

Возникает исключение:

Инициализатор типа "GradientDescentWPF.WpfExConrols.GridEx" выдал исключение.
{"Тип значения по умолчанию не совпадает с типом свойства \"ForeColor\"."}


К сожалению, мне оно не слишком информативно. Подскажите, пожалуйста, что сделано не так.

PM MAIL   Вверх
tol05
Дата 12.12.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 3
Всего: 170



вместо
Код

 public static readonly DependencyProperty BindColorProperty = 
       DependencyProperty.Register("ForeColor", typeof(System.Windows.Media.Brush), typeof(GridEx), new PropertyMetadata(false));

используйте
Код

 public static readonly DependencyProperty BindColorProperty = 
        DependencyProperty.Register("ForeColor", typeof(System.Windows.Media.Brush), typeof(GridEx));



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
jenik15
Дата 12.12.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Спасибо все работает. 

Только использовал для DependencyProperty new FrameworkPropertyMetadata(System.Windows.Media.Brushes.Black,
                        FrameworkPropertyMetadataOptions.AffectsMeasure), чтоб задать Brushes.Black как стандартный цвет.
Код

     public static readonly DependencyProperty BindColorProperty = DependencyProperty.Register(
          "ForeColor", typeof(System.Windows.Media.Brush), typeof(GridEx), new FrameworkPropertyMetadata(System.Windows.Media.Brushes.Black,
                        FrameworkPropertyMetadataOptions.AffectsMeasure));

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.