WPF UserControl属性

时间:2014-06-11 16:10:12

标签: c# wpf xaml controls dependency-properties

在下面的代码中,我有一个包含椭圆和文本块的UserControl。我想创建一个可以重用的可重用控件,允许我根据字符串设置文本,并根据布尔值更改红色/绿色之间的填充颜色。

我现在可以通过深入挖掘标记并使用一些复杂的绑定来实现这一点,但我希望在列表中重用此控件,并且为此目的创建控件似乎更容易。但是,我不确定下一步该怎么做,如果我应该创建与FillText的值相关的依赖项属性,或者是什么。

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="Herp.Derp.View.DeliveryStatusIndicator"
    x:Name="UserControl"
    d:DesignWidth="91" d:DesignHeight="35">

    <Grid x:Name="LayoutRoot">
        <StackPanel  Orientation="Horizontal">
            <Ellipse Width="35" Height="35" Fill="Green">
                <Ellipse.OpacityMask>
                    <VisualBrush Stretch="Fill" Visual="{StaticResource appbar_location_circle}"/>
                </Ellipse.OpacityMask>
            </Ellipse>
            <TextBlock Style="{StaticResource Heading2}" 
                       VerticalAlignment="Center" Margin="3,0,0,0">
                 <Run Text="FRONT"/>
            </TextBlock>
        </StackPanel>
    </Grid>
</UserControl>

3 个答案:

答案 0 :(得分:2)

这里如何实现这个目标

<强>用户控件

/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }
       public static readonly DependencyProperty FrontTextProperty = DependencyProperty.Register( "FrontText", typeof(string),typeof(UserControl1), new FrameworkPropertyMetadata(string.Empty));
    public string FrontText
    {
        get { return (string)GetValue(FrontTextProperty); }
        set {
            SetValue(FrontTextProperty, value);
            frontBlock.Text = value;  
        }

    }
    public static readonly DependencyProperty EllipseStateProperty = DependencyProperty.Register("EllipseState", typeof(bool), typeof(UserControl1), new FrameworkPropertyMetadata(false));
    public bool EllipseState
    {
        get { return (bool)GetValue(EllipseStateProperty); }
        set
        {
            SetValue(EllipseStateProperty, value);
            if (value)
            {
                ellipse.Fill  = new SolidColorBrush( Colors.Green);  
            }
            else
            {
                ellipse.Fill = new SolidColorBrush(Colors.Red);
            }

        }

    }


}

MainWindow

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

        <local:UserControl1 EllipseState="{Binding yourProperty }"/>
        <CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="207,94,0,0" VerticalAlignment="Top"/>

    </Grid>
</Window>

答案 1 :(得分:0)

是的,要创建&#34; parent&#34; XAML可以为其分配绑定,您需要为要绑定的每个字段创建DependencyProperty

然后,您可以将用户控件xaml绑定到DP的支持属性。

答案 2 :(得分:0)

以下是我获得的解决方案:

public partial class DeliveryStatusIndicator : UserControl
{
    public DeliveryStatusIndicator()
    {
            InitializeComponent();          
    }

    public static readonly DependencyProperty DeliveryDescriptionProperty = DependencyProperty.Register("DeliveryDescription", typeof(string), typeof(DeliveryStatusIndicator), new FrameworkPropertyMetadata("Default", DescriptionChangedEventHandler));

     private static void DescriptionChangedEventHandler(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         ((DeliveryStatusIndicator)d).Desc.Text = (string)e.NewValue;
     }

     public string DeliveryDescription
     {
         get { return (string)GetValue(DeliveryDescriptionProperty); }
         set
         {
             SetValue(DeliveryDescriptionProperty, value);
         }

     }

     public static readonly DependencyProperty DeliveryStatusProperty = DependencyProperty.Register("DeliveryStatus", typeof(bool), typeof(DeliveryStatusIndicator), new FrameworkPropertyMetadata(false, StatusChangedEventHandler));

     private static void StatusChangedEventHandler(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         ((DeliveryStatusIndicator)d).Indicator.Fill = (bool)e.NewValue ? new SolidColorBrush(Colors.Green) : new SolidColorBrush(Colors.Red);
     }

     public bool DeliveryStatus
     {
         get { return (bool)GetValue(DeliveryStatusProperty); }
         set
         {
             SetValue(DeliveryStatusProperty, value);
         }
     }

}