1

У меня имеется UserControl TabPage, который задает два пустых контейнера стандартных размеров, в которые записывается пользовательское содержимое через свойства ControlPanelItem и FormItem.

Код:

<UserControl x:Class="EmbeddedControlTest.TabPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:EmbeddedControlTest"
             mc:Ignorable="d" 
             >
    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition MinWidth="500"/>
        </Grid.ColumnDefinitions>
        <ContentControl x:Name="ControlPanelContainer" Grid.Column="0"  Content="{Binding ControlPanelItem, RelativeSource={RelativeSource AncestorType=local:TabPage}}"/>
        <ContentControl  x:Name="PageContainer" Grid.Column="1" Content="{Binding FormItem, RelativeSource={RelativeSource AncestorType=local:TabPage}}"/>
    </Grid>
</UserControl>

Далее пример кода, где в TabPage вставляются пользовательские элементы ControlPanel и Form:

<Window x:Class="EmbeddedControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EmbeddedControlTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TabControl>
            <TabItem>
                <TabItem.Header>Заголовок</TabItem.Header>
                <TabItem.Content>
                    <local:TabPage>
                        <local:TabPage.ControlPanelItem>
                            <local:ControlPanel/>
                        </local:TabPage.ControlPanelItem>
                        <local:TabPage.FormItem>
                            <local:Form/>
                        </local:TabPage.FormItem>
                    </local:TabPage>
                </TabItem.Content>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

В принципе разметка работает, но я хотел бы вместо такой лесенки с тэгами прописать UserControl ControlPanel и Form как атрибуты в корневом теге local:TabPage. Наподобие:

    <TabControl>
        <TabItem>
            <TabItem.Header>Заголовок</TabItem.Header>
            <TabItem.Content>
                <local:TabPage ControlPanelItem="{StaticResource local:ControlPanel}" FormItem="{StaticResource local:Form}" />
            </TabItem.Content>
        </TabItem>
    </TabControl>

Но не знаю правильного синтаксиса. Возможно ли что-либо подобное средствами XAML?

Alexandr
  • 569

1 Answers1

1

вам нужно сделать свойства ControlPanelItem и FormItem DependencyProperty, а ваши пользовательские контролы ControlPanel и Form, реализовать как ресурсы (что бы можно было работать с StaticResource)

Xaml TabPage:

<UserControl x:Class="StackOverflowQuestHelp.TabPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:StackOverflowQuestHelp"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition MinWidth="500"/>
    </Grid.ColumnDefinitions>
    <ContentControl x:Name="ControlPanelContainer" Grid.Column="0"  Content="{Binding ControlPanelItem, RelativeSource={RelativeSource AncestorType=local:TabPage}}"/>
    <ContentControl  x:Name="PageContainer" Grid.Column="1" Content="{Binding FormItem, RelativeSource={RelativeSource AncestorType=local:TabPage}}"/>
</Grid></UserControl>

Code-Behind TabPage:

public partial class TabPage : UserControl
{
public object ControlPanelItem
{
    get { return (object)GetValue(ControlPanelItemProperty); }
    set { SetValue(ControlPanelItemProperty, value); }
}
public static readonly DependencyProperty ControlPanelItemProperty = DependencyProperty.Register(&quot;ControlPanelItem&quot;, typeof(object), typeof(TabPage), new PropertyMetadata(null));

public object FormItem
{
    get { return (object)GetValue(FormItemItemProperty); }
    set { SetValue(FormItemItemProperty, value); }
}
public static readonly DependencyProperty FormItemItemProperty = DependencyProperty.Register(&quot;FormItem&quot;, typeof(object), typeof(TabPage), new PropertyMetadata(null));

public TabPage()
{
    InitializeComponent();
}

}

Xaml реализации:

<Window x:Class="StackOverflowQuestHelp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:StackOverflowQuestHelp"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800" x:Name="ThisWindow">
<Window.Resources>
    <Grid x:Key="ControlPanel" Background="Blue">
&lt;/Grid&gt;
&lt;Border x:Key=&quot;Form&quot; Background=&quot;Red&quot;&gt;

&lt;/Border&gt;

</Window.Resources> <Grid> <local:TabPage ControlPanelItem="{StaticResource ControlPanel}" FormItem="{StaticResource Form}"></local:TabPage> </Grid>

Пример работы: введите сюда описание изображения

Nick
  • 103