我有两个关于在Windows Phone上开发的问题:
我想创建自定义控件并能够在其中提供一些额外的XAML。因此,我在ContentControl
内使用ContentPresenter
ControlTemplate
。
<ContentControl>
<ControlTemplate>
<TextBlock Name="TextBlockControl" Text="Existing controls"/>
<ContentPresenter/>
</ControlTemplate>
</ContentControl>
虽然有效,但我无法从代码隐藏中访问TextBlockControl
内的ControlTemplate
。 FindName
始终返回null。
其次,我想为Control提供属性,所以我创建了DependencyProperty,如下所示:
public string CustomText
{
get { return (string)GetValue(CustomTextProperty); }
set
{
SetValue(CustomTextProperty, value);
TextBlockControl.Text = value;
}
}
public static readonly DependencyProperty CustomTextProperty =
DependencyProperty.Register("CustomText", typeof(string), typeof(MyControl), null);
正如您所看到的,我写了TextBlockControl.Text = value;
来为我的Control中的TextBlock设置文本。当我设置静态字符串时 - 它可以工作
<MyControl CustomText="Static Text"/>
但是当我想使用Binding
时(例如LocalizedStrings
资源) - 它不起作用。我错过了PropertyMeta回调,还是一些IPropertyChanged继承?我已经阅读了大量有关同一问题的StackOverflow问题,但没有回答我的问题。
答案 0 :(得分:1)
第一个问题的答案:
如果您使用自定义控件并分配模板,则可以使用以下命令访问该模板中的元素:
[TemplatePart(Name = "TextBlockControl", Type = typeof(FrameworkElement))]
你必须把这个属性放到像blend这样的工具上,知道这个自定义控件的模板必须有一个名为TextBlockControl的文本块。然后从控件的OnApplyTemplate中你应该得到一个对它的引用:
protected override void OnApplyTemplate()
{
_part1 = this.GetTemplateChild("TextBlockControl") as FrameworkElement;
base.OnApplyTemplate();
}