4

カスタム依存関係プロパティにバインドするときに WPF デザイナーを更新する際に問題があります。

次の例では、カスタムの MyAwesomeFill プロパティで塗りつぶす単純な Ellipse を作成します。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;
        }

    }
}
4

1 に答える 1

4

コードビハインドは、設計者による実行が保証されているわけではありません。MyEllipseコントロールをウィンドウに追加すると、実行されます(ウィンドウ内の楕円の背景は黄色になります)が、コントロールを直接見ると実行されません。これは、それが重要なことであるあなたのコントロールのユーザーのために働くことを意味します。

デザイナーでMyEllipseを開いたときに見栄えが良くなるように修正するには、フォールバック値を追加します。

<Ellipse 
    Stroke="Black" 
    StrokeThickness="5" 
    Fill="{Binding MyAwesomeFill, FallbackValue=Yellow}">
</Ellipse>
于 2009-05-13T19:13:59.420 に答える