代码之家  ›  专栏  ›  技术社区  ›  Andrew Garrison

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

  •  3
  • Andrew Garrison  · 技术社区  · 16 年前

    作为后续行动 this question 在建议我使用ContentControl的地方,当我使用自定义类时遇到了一个场景,该类与页面上的ContentControl发生冲突,在该ContentControl中定义的任何控件都无法从页面访问。所有成员变量都为空。

    例如,假设我创建的自定义类派生自 内容控制 被命名 MyGulpbox 我尝试在页面控件中使用它:

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

    当我试图从页面的代码隐藏中访问mytextbox时,成员变量为空。对于这个场景,访问这些控件以便在页面的代码隐藏中使用它们的最佳解决方案是什么?

    谢谢!

    编辑: 这是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 回复  |  直到 16 年前
        1
  •  2
  •   AnthonyWJones    16 年前

    让我通过展示我为测试您发布的内容所采取的步骤,逐步将其整理好:

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

    • 向Silverlight项目添加新项,选择“Silverlight模板化控件”,将此项称为“MyGroupBox”。

    • 打开将要创建的主题\generic.xaml。它将包含A样式:

    通用xAML:

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

    • 编辑mygroupbox.cs,修改以继承自 ContentControl 并添加 Title 依赖属性。

    MyGulpbox

    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
    
    }
    
    • 打开主页。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”的元素。