对于ContentControl中的控件的引用在父(页)级别为空

时间:2010-07-20 14:27:01

标签: silverlight xaml contentcontrol

作为this question的后续内容,我建议使用ContentControl,当我使用从ContentControl在页面上进行定制的自定义类时,我遇到了一个场景,在ContentControl中定义的任何控件都是无法从页面访问。所有成员变量都为空。

对于Instance,假设我创建的自定义类派生自 ContentControl ,命名为 MyGroupBox ,我尝试在Page控件中使用它:

<UserControl x:Class="MyApplication.MyUserControl">
   <local:MyGroupBox Title="Basic Information">
      <TextBox x:Name="MyTextBox" />
   </local:MyGroupBox>
</UserControl>

当我尝试从后面的Page代码中访问MyTextBox时,成员变量为null。这个场景的最佳解决方法是什么才能访问这些控件,以便我可以在Page的代码中使用它们?

谢谢!

编辑: 这是MyGroupBox控件的默认模板

<Style TargetType="local:MyGroupBox">
    <Setter Property="Foreground" Value="#FF000000"/>
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="VerticalContentAlignment" Value="Top"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyGroupBox">
                <Border BorderThickness="1" Margin="8,8,0,0">
                    <Border.BorderBrush>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FF979797" Offset="0"/>
                            <GradientStop Color="#FFF1F1F1" Offset="1"/>
                        </LinearGradientBrush>
                    </Border.BorderBrush>
                    <StackPanel>
                        <Grid>
                            <Rectangle>
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="White" Offset="0"/>
                                        <GradientStop Color="#FFDFE2ED" Offset="1"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <TextBlock Text="{TemplateBinding Title}" Margin="10,3,3,3" TextAlignment="Center" HorizontalAlignment="Left" />
                        </Grid>
                        <ContentPresenter Cursor="{TemplateBinding Cursor}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>    

编辑:

public MyUserControl()
{
    InitializeComponent();

    if (this.MyTextBox == null)
    {
        // MyTextBox is null at this point - is there a way to get 
        // the InitializeComponent method to find the control named MyTextBox when
        // it is inside of a ContentControl derived class?
        MessageBox.Show("MyTextBox is null");
    }
}

1 个答案:

答案 0 :(得分:2)

让我通过展示我为测试你所发布的内容而采取的步骤来引导你把它放在一起: -

  • 在Visual Studio中创建Silverlight应用程序

  • 在Silverlight项目中添加一个新项目,选择“Silverlight Templated Control”,将其命名为“MyGroupBox”。

  • 打开现在已创建的Themes \ Generic.xaml。它将包含一种风格: -

Generic.Xaml: -

<Style TargetType="local:MyGroupBox">
   ...
</Style>
  • 将其全部内容替换为您问题中的内容。

  • 编辑MyGroupBox.cs,修改为从ContentControl继承并添加Title依赖属性。

MyGroupBox.cs: -

public class MyGroupBox : ContentControl
{
    public MyGroupBox()
    {
        this.DefaultStyleKey = typeof(MyGroupBox);
    }

    #region public string Title

    public string Title
    {
        get { return GetValue(TitleProperty) as string; }
        set { SetValue(TitleProperty, value); }
    }

    public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register(
                    "Title",
                    typeof(string),
                    typeof(MyGroupBox),
                    new PropertyMetadata(null));
    #endregion public string Title

}
  • 打开MainPage.Xaml为MyGroupBox添加一些用法

在MainPage.xaml

<Grid x:Name="LayoutRoot">
    <StackPanel>
        <local:MyGroupBox Title="Test" HorizontalContentAlignment="Stretch">
            <TextBox x:Name="MyTextBox" />
        </local:MyGroupBox>
    </StackPanel>
</Grid>
  • 编辑MainPage.xaml.cs以测试MyTextBox是否为空

    public MainPage()
    {
        InitializeComponent();
        MessageBox.Show((MyTextBox == null).ToString());
    }
    

我得到“False”,InitializeComponent已成功找到名为“MyTextBox”的元素。