我希望将UserControl
设置为XAML中另一个Content
的{{1}},就像设置UserControl
{{1}一样成为任何东西。
假设我的“外部”Button's
看起来像这样:
Content
我想以这种方式实例化:
UserControl
如何设计<MyUserControl>
<Grid>
<Border FancyPantsStyling="True">
<-- I want to insert other controls here -->
</Border>
</Grid>
</MyUserControl>
以在特定位置呈现<local:MyUserControl>
<local:MyUserControl.Content>
<local:AnotherControl />
</local:MyUserControl.Content>
</local:MyUserControl>
?
答案 0 :(得分:4)
您放入UserControl的XAML的所有内容都是其内容,因此您无法通过设置Content属性来注入其他内容。有几种不同的方法可以解决这个问题。如果你在MyUserControl的代码隐藏中没有任何东西,你可以摆脱它并使用类似的东西:
<ContentControl>
<ContentControl.Template>
<ControlTemplate TargetType="{x:Type ContentControl}">
<Grid>
<Border FancyPantsStyling="True">
<ContentPresenter/>
</Border>
</Grid>
</ControlTemplate>
</ContentControl.Template>
<local:AnotherControl/>
</ContentControl>
如果您的代码背后不能直接访问XAML元素,您可以对现有控件执行类似的操作(因为UC派生自ContentControl):
<local:MyUserControl>
<local:MyUserControl.Template>
<ControlTemplate TargetType="{x:Type local:MyUserControl}">
<Grid>
<Border FancyPantsStyling="True">
<ContentPresenter/>
</Border>
</Grid>
</ControlTemplate>
</local:MyUserControl.Template>
</local:MyUserControl>
如果您需要将现有内容保持连接到您的代码隐藏,您可以使用DataTemplate传入外部内容(传入MyUserControl上的新DP)并将该模板应用于UC XAML中的ContentControl。
答案 1 :(得分:0)
除非我误解了这个问题,否则你可以在你的控制中使用并将其内容设置为你需要的任何内容。
答案 2 :(得分:0)
我有一个想法,然后尝试了一下,它对我有用。我只是想把这个分享给其他人。我希望它会有用。
解释解决方案结束的视频链接:Video Link
基本思路是创建 UIElement DependencyProperty 而不是创建 Border DependencyProperty
首先,您应该将边框或面板或您想要的任何内容添加到您的用户控件(在您的情况下是“MyUserControl”),并确保它具有可从 .cs 文件访问的名称:
<Border x:Name="LeftBorder" Grid.Column="0">
然后您应该向您的用户控件添加一个公共 UIElement 值(在您的情况下它是“MyUserControl”):
public UIElement LeftBorderChild
{
get { return (UIElement)GetValue(LeftBorderChildProperty ); }
set { SetValue(LeftBorderChildProperty , value); }
}
其次,Dependencyproperty 的类型必须是 UIElement:
public static readonly DependencyProperty LeftBorderChildProperty = DependencyProperty.Register("LeftBorderChild", typeof(UIElement), typeof(MyUserControl), new PropertyMetadata(new PropertyChangedCallback(LeftBorderChildChanged)));
在这些之后,输入事件:
public static void LeftBorderChildChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyUserControl thisUserControl = d as MyUserControl;
thisCombobox._LeftBorderChildChanged(e); // Calling local event. The new child will be added in this local event function.
}
public void _LeftBorderChildChanged(DependencyPropertyChangedEventArgs e)
{
// In this function, new child element will be added to inside of LeftBorder
this.LeftBorder.Child = (UIElement)e.NewValue; // Sets left border child
}
我们已经完成了这个课程。让我们从其他类调用它并在其中添加一个控件。
<local:MyUserControl Width="312" HorizontalAlignment="Right"
Margin="48, 0, 0, 0" VerticalAlignment="Center"
Height="56" >
<local:MyUserControl.LeftBorder>
<-- You can insert another control here -->
<-- Just don't remember that if you want to add more than one controls, you should add a panel then add controls into inside of the panel because Border child can only 1 child item -->
<StackPanel>
<-- Now you can insert your controls -->
</StackPanel>
</local:MyUserControl.LeftBorder>
</local:MyUserControl>
注意:当您首先执行此操作时,您必须先运行您的程序,然后才能在 xaml 设计器中查看。运行您的程序后,所有设计系统都将同步运行。 我希望我理解你的意思并正确回答。 谢谢