WPF Designer и проблема привязки к свойству зависимости - PullRequest
3 голосов
/ 13 мая 2009

У меня проблема с обновлением дизайнера WPF при привязке к пользовательским свойствам зависимостей.

В следующем примере я создаю простой эллипс, который я хотел бы заполнить своим собственным свойством MyAwesomeFill. MyAwesomeFill имеет значение по умолчанию кисти Yellow SolidColor.

Проблема в том, что в контрольной форме конструктора я не вижу заполнение эллипса по умолчанию (желтый), вместо этого эллипс заполнен SolidColor (# 00000000). Однако, когда я запускаю приложение, все работает ОТЛИЧНО.

У вас есть идеи, почему это может происходить?

Спасибо.

Вот код, который я использую:

XAML:

<UserControl x:Class="TestApplication.MyEllipse"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
        <Ellipse Stroke="Black" StrokeThickness="5" Fill="{Binding MyAwesomeFill}"></Ellipse>
    </Grid>
</UserControl>

C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TestApplication
{
    public partial class MyEllipse : UserControl
    {
        #region Dependency property MyAwesomeFill
        //Define and register dependency property
        public static readonly DependencyProperty MyAwesomeFillProperty = DependencyProperty.Register(
            "MyAwesomeFill",
            typeof(Brush),
            typeof(MyEllipse),
            new PropertyMetadata(new SolidColorBrush(Colors.Yellow), new PropertyChangedCallback(OnMyAwesomeFillChanged))
        );

        //property wrapper
        public Brush MyAwesomeFill
        {
            get { return (Brush)GetValue(MyAwesomeFillProperty); }
            set { SetValue(MyAwesomeFillProperty, value); }
        }

        //callback
        private static void OnMyAwesomeFillChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            MyEllipse m = (MyEllipse)obj;
            m.OnMyAwesomeFillChanged(e);
        }
        #endregion

        //callback
        protected virtual void OnMyAwesomeFillChanged(DependencyPropertyChangedEventArgs e)
        {
        }

        public MyEllipse()
        {
            InitializeComponent();

            DataContext = this;
        }

    }
}

1 Ответ

3 голосов
/ 13 мая 2009

Код позади не гарантированно будет выполнен дизайнером. Если вы добавите свой элемент управления MyEllipse в окно, оно будет работать (эллипс в окне имеет желтый фон), но не при непосредственном взгляде на элемент управления. Это означает, что это будет работать для пользователей вашего контроля, что является важным.

Чтобы это выглядело хорошо при открытии MyEllipse в конструкторе, добавьте запасное значение.

<Ellipse 
    Stroke="Black" 
    StrokeThickness="5" 
    Fill="{Binding MyAwesomeFill, FallbackValue=Yellow}">
</Ellipse>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...