2014-08-27 2 views
0

Я пытаюсь создать пользовательскую панель с шаблоном. По крайней мере, попробуй. Я знаю, что у 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. Любая помощь?

+0

1. 'Panel' не выглядит, поэтому я не понимаю, как вы можете сделать свой контроль похожим на «Панель». 2. * Попробовали преобразовать SupremeCard в Panel, но я не могу изменить его внешний вид * ...если вы просто хотите расширить 'Panel', просто добавьте' Panel' вместо 'Control':' public class SupremeCard: Panel' – Sheridan

+0

Пробовал уже. Переопределение и измерение. Но я не могу изменить его внешний вид, потому что это панель. –

+0

* Я не могу изменить его внешний вид, потому что это панель * ... какой внешний вид ??? Что вы на самом деле пытаетесь сделать здесь в целом, потому что ваш вопрос очень неясен? – Sheridan

ответ

1

Panel s в WPF по умолчанию нет. Если вы хотите сделать Panel иметь белый Background, то вы можете просто установить его Background свойство White:

<StackPanel Background="White"> 
    ... 
</StackPanel> 

Если вы хотите, чтобы тень, а затем просто добавить один:

В ресурсах :

<DropShadowEffect x:Key="Shadow" BlurRadius="10" Direction="270" ShadowDepth="7" 
    Opacity="0.5" /> 

...

<StackPanel Background="White" Effect="{StaticResource Shadow}"> 
    ... 
</StackPanel> 

Пожалуйста, не делайте общей ошибки, думая, что WPF похож на WinForms, так как он совсем другой. Нам часто приходилось создавать новые элементы управления в WinForms по многим причинам, но WPF совсем не такой. Фактически, при использовании WPF существует очень мало оснований для создания новых элементов управления, потому что мы можем адаптировать стандартные элементы управления с помощью Style s и даже определять новые ControlTemplate s.

Я думаю, что вы можете извлечь пользу из чтения страницы Control Authoring Overview на MSDN, чтобы узнать, что возможно с WPF.


UPDATE >>>

У меня есть проблема в определении радиуса угла (как в границе).

Как я говорю вам ... Panel s не имеют вид по умолчанию, так что вы можете просто добавить его в другой элемент управления, чтобы придать ему вид:

<Border BorderBrush="Black" BorderThickness="1" CornerRadius="5" Background="White" 
    Effect="{StaticResource Shadow}"> 
    <StackPanel> 
     ... 
    </StackPanel> 
</Border> 
+0

Я знаю о стилизации в WPF, но я создаю личную библиотеку управления для будущего использования. Однако я знаю, как установить фон на белый. У меня проблема с настройкой углового радиуса (например, на границе). Спасибо за возвращение. –

+0

Где я могу это поставить? В какой контроль. Повторяю, я пытаюсь создать единый элемент управления со всем этим взглядом, чтобы применить это позже. –

+0

Как насчет расширения класса 'Border'? – Sheridan

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