Я пытаюсь создать пользовательскую панель с шаблоном. По крайней мере, попробуй. Я знаю, что у Panel нет шаблона, но мне нужно применить к этой панели угловой радиус, тень и фон. Я искал решение, но я не нашел ничего, что могло бы мне помочь.Templated Panel с обычным внешним видом
XAML код
<Style TargetType="{x:Type local:SupremeCard}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:SupremeCard}">
<local:ClippingBorder CornerRadius="1" Background="{TemplateBinding Background}">
<local:ClippingBorder.Effect>
<DropShadowEffect BlurRadius="5" ShadowDepth="1" Direction="270" Color="#CCCCCC" Opacity="1"/>
</local:ClippingBorder.Effect>
<Grid x:Name="MainContainer"></Grid>
</local:ClippingBorder>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Текущий код
public class SupremeCard : Control
{
static SupremeCard()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(SupremeCard), new FrameworkPropertyMetadata(typeof(SupremeCard)));
}
}
В принципе, как вы можете видеть, что я ничего не имею. Попробовали преобразовать SupremeCard в Panel, но я не могу изменить его внешний вид. Пробовал реализовать сетку внутри SupremeCard (как Control) и Children, но после того, как вы сбросили и элемент внутри этой панели, элементы исчезли или выбрасывали исключение «Не удалось создать экземпляр объекта».
код перед:
[DesignTimeVisibleAttribute()]
[TemplatePart(Name = "MainContainer", Type = typeof(Grid))]
public class SupremeCard : Control
{
public ObservableCollection<UIElement> Children { get; private set; }
private Grid MainContainer { get; set; }
static SupremeCard()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(SupremeCard), new FrameworkPropertyMetadata(typeof(SupremeCard)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
MainContainer = base.Template.FindName("MainContainer", this) as Grid;
}
public SupremeCard()
{
Children = new ObservableCollection<UIElement>();
Children.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Children_CollectionChanged);
}
void Children_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
foreach (UIElement elem in e.NewItems)
{
MainContainer.Children.Add(elem);
}
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
foreach (UIElement elem in e.OldItems)
{
MainContainer.Children.Remove(elem);
}
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
break;
default:
break;
}
}
}
Для такой же конструкции XAML. Любая помощь?
1. 'Panel' не выглядит, поэтому я не понимаю, как вы можете сделать свой контроль похожим на «Панель». 2. * Попробовали преобразовать SupremeCard в Panel, но я не могу изменить его внешний вид * ...если вы просто хотите расширить 'Panel', просто добавьте' Panel' вместо 'Control':' public class SupremeCard: Panel' – Sheridan
Пробовал уже. Переопределение и измерение. Но я не могу изменить его внешний вид, потому что это панель. –
* Я не могу изменить его внешний вид, потому что это панель * ... какой внешний вид ??? Что вы на самом деле пытаетесь сделать здесь в целом, потому что ваш вопрос очень неясен? – Sheridan