2014-01-27 3 views
0

Я хочу знать, можно ли создать WPF UserControl и иметь дочерние/дочерние UserControls или нет? И если возможно, что было бы лучшим подходом для этого или с чего начать.WPF User Control с дочерними тегами

Например:

<CustomMenu> 
    <CustomMenuItem x:Name="menuItem1" /> 
    <CustomMenuItem x:Name="menuItem2" /> 
    .... 
</CustomMenu> 

Что в моем уме, чтобы иметь, что UserControl взять некоторую информацию и свойства, и его дети имеют другие свойства, которые идентифицируют их.

Я пытался сделать переменную в родительской UserControl, таких как UIElementCollection и представлены в XAML file как StackPanel, но это было не совсем то, что я хотел специально это разрешено иметь других детей разного типа, и я не мог» t установить любые свойства для родителя UserControl, такие как ширина

Я все еще новичок в WPF, поэтому я знаю, что должен пропустить и не знаю много чего, так что возьми меня, пожалуйста.

Я ценю всю помощь или руководство. Спасибо.

Edit:

После нанесения раствора @Dennis (https://stackoverflow.com/a/21373956/3157993), который прекрасно работал, я заметил, что странное поведение, что, если я еще один экземпляр этого UserControl в другом окне или странице он будет накапливать элементы первого меню, во втором. Например: если у меня есть меню в доме, а другое на другой странице, когда я открываю Home, он будет выглядеть отлично, но если бы я открыл другую страницу, у меня будут элементы меню на первой странице рядом с по пунктам меню на второй странице. - Nirvana Priest

ответ

2

можно сделать WPF UserControl и с дочерними/дочерними пользователями UserControls или нет?

Да, это возможно. Может быть, короткий образец будет полезен. Контроль
Родитель (XAML):

<UserControl x:Class="WpfApplication4.CustomMenu" 
      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" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding Items, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"/> 
    </Grid> 
</UserControl> 

контроль Родитель (код-сзади):

public partial class CustomMenu : UserControl 
{ 
    public CustomMenu() 
    { 
     InitializeComponent(); 
    } 

    public ObservableCollection<CustomMenuItem> Items 
    { 
     get { return (ObservableCollection<CustomMenuItem>)GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
     "Items", 
     typeof(ObservableCollection<CustomMenuItem>), 
     typeof(CustomMenu), 
     new PropertyMetadata(new ObservableCollection<CustomMenuItem>())); 
} 

контроль за детьми (XAML):

<UserControl x:Class="WpfApplication4.CustomMenuItem" 
      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" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBlock Text="Hello, world!"/> 
    </Grid> 
</UserControl> 

Использование:

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication4" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <local:CustomMenu> 
      <local:CustomMenu.Items> 
       <local:CustomMenuItem /> 
       <local:CustomMenuItem /> 
       <local:CustomMenuItem /> 
      </local:CustomMenu.Items> 
     </local:CustomMenu> 
    </Grid> 
</Window> 

Но непонятно, чего вы пытаетесь достичь. Возможно, вам нужен custom control, унаследованный от HeaderedItemsControl?

+0

Большое спасибо за этот пример. То, что я пытаюсь достичь, - создать меню и его пункты меню (которые я уже сделал для этого элемента управления). Я собираюсь проверить, лучше ли настраивать пользовательский контроль, а не пользовательский элемент управления. Еще раз спасибо. Я собираюсь реализовать его таким образом или с помощью предложения CustomControl. – CodingMate

+0

Я заметил странное поведение, что если у меня есть другой экземпляр этого 'UserControl' в другом' Window' или 'Page', он будет накапливать элементы первого меню, во втором. Например: если у меня есть меню в доме, а другое на другой странице, когда я открываю Home, он будет выглядеть отлично, но если бы я открыл другую страницу, у меня будут элементы меню на первой странице рядом с по пунктам меню на второй странице. – CodingMate

1

Вы можете создать элемент управления с помощью расширяет System.Windows.Controls.Panel класс:

MSDN: Panel Class

Пример кода можно скачать на:

Create a Custom Content-Wrapping Panel Sample

+0

Спасибо за ссылку, которая проверит это. Я предпочитаю сделать это через UserControl или CustomControl. Но я с удовольствием даю ему шанс. – CodingMate

Смежные вопросы