BadCats
@BadCats

Что я делаю не так при создании свойства зависимости в wpf?

Есть у меня файл MainWindow.XAML
- в котором я создаю собственный элемент управления с именем ControlBrush
<ControlBrush:MyBrushClass
            x:Name="NewBackground"
              CanvasBrushCLR="{Binding ElementName=canvas1, Path=Background }">
         
        </ControlBrush:MyBrushClass>


используя класс MyBrushClass
вот я его подключаю:
xmlns:ControlBrush="clr-namespace:WpfApp1"
Задаю этому элементу управления имя x:Name="NewBackground"
Далее обращаюсь к CLR свойству CanvasBrushCLR
вот оно в классе MyBrushClass :
public double CanvasBrushCLR
        {
            get { return (double)GetValue(CanvasBrushProperty); }
            set { SetValue(CanvasBrushProperty, value); }
        }

и в качестве значения использую привязку (Binding) к элементу canvas1 на форме и его свойству Background

Что касается CLR свойства, которое я использую для привязки, оно у меня используется при регистрации свойства зависимости CanvasBrushProperty
public static DependencyProperty CanvasBrushProperty;//имя поля
static MyBrushClass()
        {
            CanvasBrushProperty = DependencyProperty.Register("CanvasBrushCLR", typeof(double ), typeof(MyBrushClass));
        }
            //CanvasBrushCLR -ИМЯ CLR обвертки 
            //typeof(Color) - тип свойства зависимости
            //typeof(MyBrushClass) - класс в котором регистрируется свойство зависимости

Ну и на форме у меня есть две кнопки и соответственно обработчики событий для них:
MyBrushClass mb;
        private void button2_Click(object sender, RoutedEventArgs e)
        {

          mb = new MyBrushClass();
          canvas1.Background.Opacity =  mb.CanvasBrushCLR; //обрабатываем binding
            
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            mb = new MyBrushClass();
            mb.CanvasBrushCLR = (double)Convert.ToInt32( TB1.GetLineText(0));
        }

Как видно в одном из обработчиков событий я в CLR свойство записываю значение из TB1 - TextBox на форме - т.е я ввожу строку в TextBox , и по нажатию на кнопку она преобразуется в double и присваивается свойству CanvasBrushCLR.
Но, когда в другой кнопке я хочу уже "проинициализированным" свойством CanvasBrushCLR присвоить canvas1.Background.Opacity у меня появляется ошибка:
Не удается задать свойство объекта "#FFFFFFFF", так как он находится в состоянии "только чтение
- хотя и Opacity и CanvasBrushCLR - имеют методы доступа get и set

Специально так подробно рассматриваю, что бы продемонстрировать, что вроде бы разобрался в свойствах зависимости - т.е примерно имею представление, но до конца не могу понять где ошибка.
  • Вопрос задан
  • 361 просмотр
Решения вопроса 1
lam0x86
@lam0x86
Скорее всего, canvas1.Background у вас равен Brushes.White. Это синглтон, и он находится в состоянии Frozen (свойство IsFrozen == true), то есть его нельзя менять. Попробуйте указать "#FFFFFF" вместо "White".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы