Я создал следующий элемент управления:
MyContentControl.xaml.cs:
public partial class MyContentControl : UserControl
{
public MyContentControl()
{
InitializeComponent();
}
public static readonly DependencyProperty MyContentProperty = DependencyProperty.Register(
"MyContent", typeof(object), typeof(MyContentControl), new PropertyMetadata(default(object)));
public object MyContent
{
get { return (object) GetValue(MyContentProperty); }
set { SetValue(MyContentProperty, value); }
}
}
MyContentControl.xaml:
<UserControl x:Class="MyContentControl"
x:Name="self"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Border BorderBrush="Gray" BorderThickness="1">
<ContentPresenter Content="{Binding ElementName=self, Path=MyContent}"/>
</Border>
</Grid>
</UserControl>
И это можно использовать так:
<controls:MyContentControl>
<controls:MyContentControl.MyContent>
<TextBox Text="Some text..."/>
</controls:MyContentControl.MyContent>
</controls:MyContentControl>
Чего я хотел бы добиться, так это возможности использовать свой контроль следующим образом:
<controls:MyContentControl>
<TextBox Text="Some text..."/>
</controls:MyContentControl>
Я хотел бы определить внутреннее содержимое, например, как для StackPanel
.
Как этого добиться?
Есть ли какая-то конкретная причина для имитации того, что будут делать StackPanel, DockPanel, Grid, Canvas, TabPanel?
@XAMlMAX: Да, я хотел бы иметь возможность просто обернуть существующие элементы управления в свой пользовательский элемент управления, например. для предоставления индивидуального дизайна или других функций. Есть ли способ лучше?
Ага, понятно. Помогут ли WrapPanel или UniformGrid? Потому что, если вы хотите иметь пользовательскую логику, например, добавление элементов управления в определенную позицию, тогда лучшим вариантом будет пользовательский элемент управления, полученный из Panel. Для «другой функциональности» я бы предложил прикрепленное свойство. Таким образом, вы можете повторно использовать его в других местах.
Если я наследую от
Panel
, могу ли я иметь свой собственный XAML?Вы можете наследовать от управления контентом, а не от пользовательского управления. См. строку редактирования здесь social.technet.microsoft.com/wiki/contents/articles/…
@Andy: Как и в случае с предложением
Panel
: (как) я могу иметь свой собственный XAML?Вы не прошли по ссылке?
@Энди: Извини за ответ, теперь я вижу это. Спасибо. Это требует организации компонентов немного по-другому, но может работать. Я проверю и посмотрю, есть ли у меня те же проблемы с именованными элементами, см. комментарий к ответу lidqy ниже.
Я не понимаю, что вы имеете в виду по поводу именованных элементов. Каждый элемент управления имеет свой собственный контекст для имен, поэтому каждый экземпляр editrow имеет контекст. Когда вы определяете элемент управления и делаете его содержимым строки редактирования, он не находится в этом контексте имени строки редактирования. Если вы хотите ссылаться на контент из строки редактирования, вы можете использовать content.property для ссылки. Из содержимого вы можете использовать относительный источник.