WPF - Vlastní Dependency Property   otázka

C#, WPF

Ahoj, potřeboval bych poradit. Vytvářím si vlastní Control skládající se z TextBoxu a Rectangle pojmenovanou jako InputBox.

K tomu vytvářím vlastní vlastnost "RectangleFill", která bude měnit barvu obdelníčku v tomto objektu. Jak provázat vytvořenou vlastnost s vlastností Rectangle.Fill?

Můj C# kód pro novou vlastnost je následující

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public partial class InputBox : UserControl
{
    public readonly DependencyProperty RectangleFillProperty = DependencyProperty.Register("RectangleFill", typeof(Brush), typeof(InputBox));
    public Brush RectangleFill
    {
        get
        {
            return GetValue(RectangleFillProperty) as Brush;
        }
 
        set
        {
            SetValue(RectangleFillProperty, value);
        }
    }
 
 
    public InputBox()
    {
        InitializeComponent();
    }
}

a XAML kód pro obdelník mám

1
<Rectangle Width="30" Height="30" Fill="{Binding Path=RectangleFill, FallbackValue=Red, Mode=TwoWay}" />

Předem děkuji za pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chybí vám tam metadata a k nim náležící procedura volající změnu property.

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public partial class UserControl1 : UserControl
{
 
    public static DependencyProperty RectangleFillProperty =
        DependencyProperty.Register("RectangleFill",typeof (Brush),typeof (UserControl1),
                                     new PropertyMetadata(Brushes.Transparent,OnRectangleFillChanged));
 
    private static void OnRectangleFillChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var ctrl = d as UserControl1;
        if (ctrl == null) return;
        ctrl.RectangleFill = (Brush)e.NewValue;
    }
 
    public Brush RectangleFill
    {
        get { return (Brush)GetValue(RectangleFillProperty); }
        set { SetValue(RectangleFillProperty, value); }
    }
 
    public UserControl1()
    {
        InitializeComponent();
    }
 
}

Xaml:

1
2
3
4
5
6
7
8
<UserControl x:Class="WpfApplication1.UserControl1"
             x:Name="This"
             ..........>
......       
        <Rectangle Fill="{Binding RectangleFill, ElementName=This, FallbackValue=Red}" />
......
 
</UserControl>
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Paráda, už mi to funguje. Mnohokrát děkuji! :)

Ještě bych se chtěl zeptat, jak bych mohl pro nějakou property nastavit její možné hodnoty, např. pokud budu mít property: Choice, budu mít po napsání Choice=" na výběr dvě hodnoty: Agree a Disagree.

Technicky vzato potřebuju udělat něco jako HorizontalAlignment property a vytvořit k tomu ty možnosti (Left, Center, Right, ...)

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

K tomu by mělo stačit nadefinovat enum:

1
2
3
4
5
public enum Choice
{
    Agree = 1,
    Disagree = 0
}

a danou depencency property udělat typu tohoto enumu (tj. typeof(Choice)).

Intelisense v XAML editoru by pak měl automaticky nabízet výběr z možných hodnot enumu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback