在MainPage.xaml中修改UserControl的网格
本文关键字:UserControl 网格 修改 MainPage xaml | 更新日期: 2023-09-27 17:57:49
我发现了很多关于这个主题的线程,但无法使我的应用程序正常工作,所以我在这里问了一个新问题。
我想制作一个UserControl元素,它有一个可以从外部填充的网格。这是UserControl Xaml部分:
<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"未被识别或无法访问Member(我翻译自德语错误消息)。但当我键入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在代码后台获取网格。但这并不是直接在某个地方创建东西,然后把它们放在我想要的地方。
在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>
感谢John Bowen的正确想法。到目前为止,我得到的最佳解决方案是:主页.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背景=/所以这一定是正确的方式,我只是错过了一些东西。。
编辑:如果我将MyControl设置为UserControl,则.Content
会覆盖其中的所有内容。如果我把它做成ContentControl,它似乎看到了内部网格,因为它几乎把所有东西都放在了正确的位置。但是我仍然看不到在MyControl中声明的任何其他元素。如果我不设置.Content
,我会看到所有内部的东西,所有的方法都在工作,但当然我不想放在里面。
第2版:我设法做到了,但又犯了新的错误。但我想最好把另一条线连接起来;)保留对传递给UserControl 的对象的引用