背景
正如标题所述,我有一个自定义用户控件。我正在使用 Silverlight 4,但我很确定这也适用于 WPF。目标是创建一个控件,该控件将为开发人员提供选项,以仅显示他们希望在特定页面上显示的控件部分,以及格式、对齐方式、控件替代文本和方向属性。
要展示的部分是:
Country
SubdivisionCategory
(州、区、边远地区)SubdivisionCensusRegion
(东北,南部,中西部,西部)SubdivisionCensusDivision
(东北中、东中南等)Subdivision
我只是试图访问当 DEV 在 XAML 中创建此控件的实例时设置的属性的值。DependencyProperty
我已经为我认为用于此目的的每个属性设置了自定义对象。
问题
我的问题是,SetMargins()
所有this.ShowXxx
属性都等于方法签名new PropertyMetadata(true)
部分中设置的值。DependencyProperty.Register
因此,没有正确设置边距。
问题
如何获取this.ShowXxx
属性的初始 XAML 值或我在 XAML 中设置的任何其他属性?
代码
下面是 XAML 标记的示例:
<local:CountryAndSubdivisionFilter
x:Name="ReportSettingsCountryAndSubdivisionFilter"
Orientation="Horizontal"
CountryFormat="Name"
SubdivisionFormat="Name"
ShowCountry="False"
ShowSubdivisionCategory="False"
ShowSubdivisionCensusRegion="False"
ShowSubdivisionCensusDivision="True"
ShowSubdivision="True"
SubdivisionCensusDivisionText="Region"
SubdivisionText="State"
Margin="0,15,0,0" />
ShowCountry
这是该属性的示例:
#region ShowCountry
public static readonly DependencyProperty ShowCountryProperty = DependencyProperty.Register
(
"ShowCountry",
typeof(bool),
typeof(CountryAndSubdivisionFilter),
new PropertyMetadata(true)
);
public bool ShowCountry
{
get
{
return (bool) GetValue(ShowCountryProperty);
}
set
{
SetValue(ShowCountryProperty, value);
this.CountryStackPanel.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
this.SetMargins();
}
}
#endregion
这是SetMargins()
方法:
private void SetMargins()
{
this.CountryStackPanel.Margin = new Thickness(0);
this.SubdivisionCategoryStackPanel.Margin = new Thickness(0);
this.SubdivisionCensusRegionStackPanel.Margin = new Thickness(0);
this.SubdivisionCensusDivisionStackPanel.Margin = new Thickness(0);
this.SubdivisionStackPanel.Margin = new Thickness(0);
var spList = new List<StackPanel>();
if (this.ShowCountry)
spList.Add(this.CountryStackPanel);
if (this.ShowSubdivisionCategory)
spList.Add(this.SubdivisionCategoryStackPanel);
if (this.ShowSubdivisionCensusRegion)
spList.Add(this.SubdivisionCensusRegionStackPanel);
if (this.ShowSubdivisionCensusDivision)
spList.Add(this.SubdivisionCensusDivisionStackPanel);
if (this.ShowSubdivision)
spList.Add(this.SubdivisionStackPanel);
int spIndex = 1;
foreach(var sp in spList)
{
var i = (spIndex < spList.Count) ? 15 : 0;
var j = (spIndex == 1) ? 0 : 15;
sp.Margin = (this.Orientation == Orientation.Horizontal)
? new Thickness(0, 0, i, 0)
: new Thickness(0, j, 0, 0);
spIndex++;
}
}