WPF UserControl在另一个UserControl中

时间:2010-10-16 17:36:26

标签: wpf user-controls

我希望将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>

3 个答案:

答案 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 Linkenter image description here

基本思路是创建 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 设计器中查看。运行您的程序后,所有设计系统都将同步运行。 我希望我理解你的意思并正确回答。 谢谢