Не удается выполнить обновление WPF Usercontrol в конструкторе - PullRequest
0 голосов
/ 22 февраля 2020

Я действительно схожу с ума, я сделал все, что нашел на net, и все еще нет шансов.

У меня есть простой прямоугольник и красно-синее перечисление. Я хочу анимировать его цвет в конструкторе, изменяя значение пользователем.

MyCustomU C .xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.ComponentModel;
using System.Diagnostics;

namespace WpfApp1
{
    public enum Pill
    { red = 1, blue = 2 }

    public partial class MyCustomUC : UserControl
    {
        private Color ColorToAnim = Color.FromRgb(255, 0, 0);

        public static DependencyProperty pill_mode = DependencyProperty.Register(
        "pillmodeval", typeof(Pill), typeof(MyCustomUC),
         new PropertyMetadata(Pill.blue, // ISSUE 1 : Default Value Is Not Working , It's always 0
         new PropertyChangedCallback(OnValueChanged)
        )); 

        [Category("Pills")]
        public Pill pillmodeval
        {
            get { return (Pill)GetValue(pill_mode); }
            set { SetValue(pill_mode, value); }
        }

        public MyCustomUC()
        {
            InitializeComponent(); //// Not Firing Either 
            color_output.Fill = new SolidColorBrush(ColorToAnim);

            // ISSUE 2 : MessageBox.Show , Debug.WriteLine Not Work On Design Mode
            MessageBox.Show("MyCustomUC Created!");
            Debug.WriteLine("MyCustomUC Created!");
        }

        void AnimateColor()
        {
            ColorAnimation new_color_anim = new ColorAnimation(ColorToAnim, TimeSpan.FromSeconds(1));
            color_output.Fill.BeginAnimation(SolidColorBrush.ColorProperty, new_color_anim);
        }

        void UpdateColor()
        {
            if (pillmodeval == Pill.red)
            {
                ColorToAnim = Color.FromRgb(0, 0, 255);
                pillmodeval = Pill.blue;
            }
            else
            {
                ColorToAnim = Color.FromRgb(255, 0, 0);
                pillmodeval = Pill.red;
            }
        }

        private void color_output_MouseUp(object sender, MouseButtonEventArgs e)
        {
            UpdateColor();
        }

        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            MyCustomUC custom_uc = (MyCustomUC)d;
            // ISSUE 3 : AnimateColor not working in Designer
            custom_uc.AnimateColor();
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            // ISSUE 2 : MessageBox.Show , Debug.WriteLine Not Work On Design Mode
            MessageBox.Show("MyCustomUC Loaded!");
            Debug.WriteLine("MyCustomUC Loaded!");
        }
    }
}

MyCustomU C .xaml:

<UserControl x:Class="WpfApp1.MyCustomUC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApp1"
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="100" Loaded="UserControl_Loaded">
    <Grid>
            <Rectangle x:Name="color_output" Fill="Black" MouseUp="color_output_MouseUp" />
    </Grid>
</UserControl>

Проблемы:

  • Вызовы конструктора не работают в Designer
  • Вызовы OnLoad не работают в Designer
  • AnimateColor не работает в Designer
  • Значение по умолчанию для DependencyProperty всегда равно нулю, не работает с enum.

Как заставить этот код работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...