0

Как поменять цвет фона формы из другой формы, не при помощи кнопки, а, например,через RichTextBox то есть пишешь цвет и меняется на заданный?

Nick Proskuryakov
  • 3,732
  • 2
  • 16
  • 40
  • А что конкретно не получается? Вам во второй форме просто нужно иметь ссылку на первую и в обработчика клика по кнопке применить пишете form1.Background = ...; – Андрей NOP Apr 04 '18 at 04:44
  • Насколько я понимаю,то что Вы написали просто меняет цвет после каждого нажатия на кнопку,но мне не нужна кнопка . А у меня не получается в одной форме в Richtextbox писать цвет,а в другой форме он должен меняться – Veronika Apr 04 '18 at 06:30
  • @Veronika, ну тогда делайте тоже самое не в обработчике клика по кнопке, а в обработчике TextChanged (или как он там называется) вашего ричтекстбокса – Андрей NOP Apr 04 '18 at 08:51
  • Когда я пишу ссылку на первую форму где должен меняться цвет, пишет Для нестатического поля, метода или свойства "Form.BackColor" требуется ссылка на объект. Принимает DefaultBackColor, но зачем мне он? – Veronika Apr 04 '18 at 10:43
  • @Veronika, когда открываете второе окно, передавайте ему ссылку на первое, например, параметром. – Андрей NOP Apr 04 '18 at 11:02

3 Answers3

1

Например, на WPF делается очень просто.

XAML:

<Grid Background="{Binding Text, ElementName=TB}">
    <TextBox HorizontalAlignment="Center" VerticalAlignment="Center" Width="100" Name="TB"/>
</Grid>

Результат:

а чё, прикольно


Если вам в реальности нужно два окна, свяжите их через общий DataContext:

// https://ru.stackoverflow.com/a/632894/10105
class VM : INotifyPropertyChanged
{
    string colorName;
    public string ColorName
    {
        get => colorName;
        set => Set(ref colorName, value);
    }

    protected bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(field, value))
            return false;

        field = value;
        NotifyPropertyChanged(propertyName);
        return true;
    }

    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    public event PropertyChangedEventHandler PropertyChanged;
}

Теперь в первом окне

<Grid Background="{Binding ColorName}">
</Grid>

и во втором

<TextBox Text="{Binding ColorName, UpdateSourceTrigger=PropertyChanged}"/>
VladD
  • 206,799
  • 1
    Спасибо, но я имела в виду из другой формы. Есть две формы: в одной пишешь цвет, а в другой меняет , посредством обычного кода, а не путем разметки – Veronika Apr 03 '18 at 18:05
  • @Veronika формы? не окна? –  Apr 03 '18 at 19:58
  • @Veronika: Ну так протяните значение через VM, например, делов-то. А почему вам обязательно через код? – VladD Apr 03 '18 at 20:02
  • Ну задание у меня такое по C#, по этому и обязательно – Veronika Apr 07 '18 at 09:04
  • @Veronika: Задание состоит в том, чтобы не использовать VM? o_O – VladD Apr 07 '18 at 11:17
  • ну нет такого в задании – Veronika Apr 07 '18 at 11:33
0

Подписываетесь на событие TextChanged и в нём пишете следующий код:

private void RichTextBox_TextChanged(object sender, EventArgs e)
{
    Color color = Color.FromName(richTextBox.Text);

    if (color.IsKnownColor)
        form2.BackColor = color;
}

form2 - это ссылка на другую форму.

  • как подписаться на событие TextChanged? Для нестатического поля, метода или свойства "Form.BackColor" требуется ссылка на объект. и еще одна ошибка 'Form2" не содержит определения для "richTextBox2_TextChanged" и не удалось найти метод расширения "richTextBox2_TextChanged", принимающий тип "Form2" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). – Veronika Apr 04 '18 at 10:54
0

Странная архитектура требует странных решений. Попробуйте во второй форме объявить статическое свойство Queue. В первой форме класть туда, во-второй выбирать. Т.е. пример выше будет:

private void RichTextBox_TextChanged(object sender, EventArgs e)
{
    Color color = Color.FromName(richTextBox.Text);

    if (color.IsKnownColor)
        Form2.QueueBackColor.Enqueue(color);
}
DerSkythe
  • 101