Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > как смена цвет родительскому контейнеру Grid?


Автор: jenik15 12.12.2009, 00:36
Подскажите, как будет правильно сделать такую вещь на 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.
//Как можно дочерним контролам сменить цвет? 
}
 


Как можно сменить цвет родительскому Контролу, чтоб сменился он у всех дочерних (Не перебирая дочерних элементов).

Автор: tol05 12.12.2009, 01:31
Цитата(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;
//*******************
 

как-то так


Автор: jenik15 12.12.2009, 15:38
Спасибо за совет. Так и хочу теперь сделать, но возникло исключение и не могу разобраться, почему оно возникает.
 Значит цвет я буду брать с родительского грида:
Написал такой вот грид в который и буду добавлять дочерние линии. Добавил ему свойство 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\"."}


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

Автор: tol05 12.12.2009, 17:45
вместо
Код

 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));

Автор: jenik15 12.12.2009, 19:42
Спасибо все работает. 

Только использовал для 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));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)