WPF依赖属性

3

我在WPF中很难理解依赖属性,可能是因为我需要的用例非常特定且文档不充分。

我有一个自定义控件,看起来像这样(请忽略所有可怕的代码,它只是暂时的!):

<UserControl x:Class="HydroAccessory.Controls.FillGraph"
         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:HydroAccessory.Controls"
         mc:Ignorable="d"
         SizeChanged="FillGraph_SizeChanged"
         d:DesignHeight="200" d:DesignWidth="300">
<Grid>

    <TextBlock x:Name="PercentageTB" Text="Fill Percentage: 0%" />

</Grid>

我在主窗口中这样调用它:

<controls:FillGraph x:Name="HydroModel" />

控件内部的代码如下:

using System;
using System.Windows;
using System.Windows.Controls;

namespace HydroAccessory.Controls
{
public partial class FillGraph : UserControl
{
    private float percentage;
    public float Percentage
    {
        get
        {
            return percentage;
        }
        set
        {
            percentage = value;
            PercentageTB.Text = String.Format("Fill Percentage: {0}", percentage.ToString() + "%");
        }
    }

    public FillGraph()
    {
        InitializeComponent();
    }
}
}

我希望您能够在我的自定义控件中,在主窗口中调用以下内容:

我想做的就是在我的自定义控件中,能够在主窗口中进行调用:

<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" />

(其中FillPercentage是另一个脚本中的内容,您不需要担心)。 该控件将被扩展,因此需要保持为自定义控件。 我知道我可能需要依赖属性,但是在尝试了许多不同的方法之后,我无法弄清楚如何完成这个看似简单的任务。感谢您的帮助。


你需要真正创建一个依赖属性。你不理解什么? - SLaks
Percentage 目前是一个普通属性。只需将其改为依赖属性即可。 - Sinatr
1
propdp片段应该能帮到你。 - Ayyappan Subramanian
我列出的代码是为了展示我想要添加依赖属性的对象 - 我尝试了许多不同的依赖属性方法(但都没有成功),所以我认为我设置属性的方式有问题 - 这就是为什么我将它留空的原因!不过,你给出的答案对我起作用了,谢谢你的帮助。 - AidanH
1个回答

7
你的代码中没有依赖属性。
这是一个依赖属性:
public partial class FillGraph : UserControl
{
    public FillGraph()
    {
        InitializeComponent();
    }

    public float Percentage
    {
        get { return (float)GetValue(PercentageProperty); }
        set { SetValue(PercentageProperty, value); }
    }

    //  Using a DependencyProperty as the backing store for Percentage.  This 
    //  enables animation, styling, binding, etc...
    public static readonly DependencyProperty PercentageProperty =
        DependencyProperty.Register("Percentage", typeof(float), 
                typeof(FillGraph), new PropertyMetadata(0.0f));
}

谢谢你的回答 - 结果发现有很多问题出错了,其中一个就是你提到的将属性元数据设置为非浮点数,还有其他的问题是没有将控件内的文本块绑定到脚本(尽管它本来可以工作,但这只是让事情变得更复杂了)。你发布的答案确实对我起了作用 - 谢谢! - AidanH
刚才是什么让事情变得复杂了? - 15ee8f99-57ff-4f92-890c-b56153
别担心,我为了方便阅读剪切了一些代码,但是导致了一些问题 - 不过现在已经全部解决了! - AidanH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接