在MainPage.xaml中修改UserControl的网格

时间:2014-04-11 09:21:55

标签: c# xaml windows-phone-8 user-controls

我找到了许多有关此主题的帖子,但无法让我的应用运行,所以我在这里提出一个新问题。

我想创建一个UserControl元素,其中包含一个可以从外部填充的Grid。 这是UserControl-Xaml-Part:

<Grid>
    <Grid.ColumnDefinitions>
         <ColumnDefinition Width="70"/>
         <ColumnDefinition Width="*"/>
         <ColumnDefinition Width="Auto"/>
         <ColumnDefinition Width="*"/>
         <ColumnDefinition Width="70"/>
     </Grid.ColumnDefinitions>

     <Grid Grid.Column="2" x:Name="ButtonGrid"/>
</Grid>

在我的MainPage.xaml外面我想这样使用它:

<UserControls:MyControl>
    <UserControls:MyControl.ButtonGrid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="130"/>
            </Grid.ColumnDefinitions>
            // Add elements and stuff
        </Grid>
    </UserControls:MyControl.ButtonGrid>
</UserControls:AppBar>

但我没有这么做。它说“ButtonGrid”未被识别或无法访问会员(我的翻译来自德语错误消息)。但是当我输入UserControls:MyControl.时,它会显示ButtonGrid

MyControl.xaml.cs如下所示:

namespace myApp
{
    public partial class MyControl: UserControl
    {
        public Grid ButtonGrid { get; set; }

        // or
        public Grid ButtonGrid
        {
            get { return (Grid)GetValue(ButtonGridProperty); }
            set { SetValue(ButtonGridProperty, value); }
        }
        public static readonly DependencyProperty ButtonGridProperty =
            DependencyProperty.Register("ButtonGrid", typeof(Grid), typeof(MyControl), new PropertyMetadata(new Grid()));

        public MyControl()
        {
            InitializeComponent();
        }
    }
}

我尝试了许多方法使这个“ButtonGrid”值可见且有效,但仍然没有。任何想法?

修改 我可以通过简单的getter获取代码隐藏中的Grid。但它不是直接在某处创造东西,然后把它们放到我想要它们的地方。

2 个答案:

答案 0 :(得分:1)

在XAML中的元素上设置名称会为该对象创建一个私有字段,然后您可以在代码隐藏中访问该字段。当您尝试使用它时,它不会使其成为其他内容的占位符。如果要将外部内容注入XAML,请使用ContentPresenter或某些ContentControl衍生产品,并将要注入的内容设置为Content属性。这是ContentControls一般使用的模式,因此您可以查看Button的默认模板,并查看此模式。

所以要使用它:

<local:MyControl>
  <local:MyControl.CustomContent>
    <Grid>
      <!-- elements and stuff to pass in -->
    </Grid>
  </local:MyControl.CustomContent>
</local:MyControl>

你会在MyControl(CustomContent)中拥有一个DependencyProperty,就像你已经尝试过的那样(但它应该是类型对象,除非你有其他类型的特定原因)。然后你的控件的XAML看起来更像是:

<Grid>
  <Grid.ColumnDefinitions>
    ...
  </Grid.ColumnDefinitions>

  <ContentPresenter Grid.Column="2" Content="{Binding CustomContent, RelativeSource={RelativeSource FindAncestor, AncestorType=local:MyControl}}"/>
</Grid>

答案 1 :(得分:0)

感谢John Bowen的正确想法。现在我到目前为止最好的解决方案是: MainPage.xaml中

<local:MyControlx:Name="Control" Grid.Row="1" Grid.RowSpan="2"
                                Height="98" VerticalAlignment="Bottom">
    <local:MyControl.Content>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="130"/>
            </Grid.ColumnDefinitions>

        <!-- Stuff inside that works! -->

        </Grid>
    </local:MyControl.Content>
</local:MyControl>

和MyControl.xaml(现在是一个ContentControl!):

<Grid x:Name="MyCtrl" Background="{StaticResource PhoneAccentBrush}"
      Height="98" VerticalAlignment="Bottom"
      Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}">
    <Grid.RenderTransform>
        <TranslateTransform x:Name="moveTransform" />
    </Grid.RenderTransform>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="70"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
       <ColumnDefinition Width="70"/>
    </Grid.ColumnDefinitions>

    <ContentPresenter Grid.Column="2"
                      Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}"/>

    <!-- Buttons and stuff that should be always there in Grid.Column=0 and Grid.Column=4 -->

    </Button>
</Grid>

MainPage.xaml中的按钮和内容是可见的,可点击的,没有任何崩溃。但我没有看到MyControl.xaml里面的按钮或PhoneAccentBrush-background = / 所以这一定是我错过的正确方法..

修改 如果我将MyControl转换为UserControl,.Content将覆盖内部的所有内容。 如果我将其设为ContentControl,它似乎可以看到内部网格,因为它将所有内容放置在正确的位置。但是我仍然看不到在MyControl中声明的任何其他元素。如果我没有设置.Content我看到所有内部的东西,所有方法都可以工作,但当然我想放在里面的东西都没有。

<强> EDIT2: 我已经以某种方式管理它,但偶然发现了新的错误。但我想最好链接其他线程;) Keep a reference to objects passed to a UserControl