2013-02-09 5 views
1

Мне нужно создать несколько GridView во всем моем приложении с теми же визуальными стилями. Этот стиль включает в себя настройку свойства ItemsPanel, а также имущества GroupStyle.Разделение стилей между несколькими элементами управления GridView

Моя проблема заключается в том, что свойство GroupStyleGridView не является зависимым. Поэтому код, который я бы хотел написать (см. Ниже), не работает.

Знаете ли вы, что у вас есть чистый способ поделиться стилем (включая GroupStyle) между несколькими GridView?

Единственное, что я могу придумать, это использовать GroupStyleSelector, но это как-то глупо, так как выбор не существует: он всегда тот же GroupStyle, который используется. Более того, я подозреваю, что это не отразилось бы на времени разработки в VS & Blend.

код Я хотел бы использовать:

<GridView 
    ItemsSource="..." 
    ItemTemplate="..." 
    Style="{StaticResource MainMenuStyle}"/> 

<Style TargetType="GridView" x:Key="MainMenuStyle"> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      ... 
     </Setter.Value> 
    </Setter> 
    <Setter Property="GroupStyle"> 
     <Setter.Value> 
      <GroupStyle> 
       ... 
      </GroupStyle> 
     </Setter.Value> 
    </Setter> 
</Style> 

+0

Можете ли вы просто создать сетку, как вы хотите, как «UserControl» и выставить свойства зависимостей для таких вещей, как ваш «ItemsSource», чтобы вы могли применить его к экземпляру, позволяя вам перерабатывать один и тот же шаблон, но все же заполнять разные данные? –

+0

Да, похоже, как искать ответы. Еще не узнал о «UserControl», кажется, подходящее время для начала. – Mic

ответ

1

У меня есть решение, и это будет, безусловно, работать на ваш вопрос, но если вы должны решить, следует ли использовать это в вашем случае или нет.

  • Если вы должны сделать такой же стиль управления во всем проекте, то вы должны сделать одну общую папку и в этой папке создать один «Custom пользовательского элемента управления» и применить все ваши стиль и настройте его, как хотите.

  • После этого, когда вам нужно применить тот же вид стиля на тот же контроль (любая управляющей сеткой), а затем просто добавить, что Настроенному пользователю
    контроля вместо предопределенного управления

Поступая это вы также достигнете архитектуры MVC и модульности.

Я занимаюсь разработкой Windows 8 приложений Metro в C# с XAML, и в том, что всякий раз, когда я хотел, чтобы этот подход, то я всегда использовать это решение, и это всегда работает ...

создать пользовательский элемент управления пользователя, вы следует использовать Visual Studio & в этом правой кнопкой мыши на проекте -> добавить -> новый элемент -> Управление учетными

(К сожалению, если вы не смогли найти решение здесь, но я думаю, что это могло бы помочь .. .)

+0

Спасибо, похоже, тот же лидер, что и другой ответ. Я сделаю это как можно скорее. – Mic

2

У меня есть волшебное счастливое решение.

Вы можете создать пользовательское прикрепленное свойство, которое вы установили в стиле, и после его установки внутренне устанавливает свойство GroupStyle в GridView.

Attached Property:

// Workaround for lack of generics in XAML 
public class GroupStyleCollection : Collection<GroupStyle> 
{ 
} 

public class GroupStyleHelper 
{ 
    public static ICollection<GroupStyle> GetGroupStyle(ItemsControl obj) 
    { 
     return (ICollection<GroupStyle>)obj.GetValue(GroupStyleProperty); 
    } 

    public static void SetGroupStyle(ItemsControl obj, ICollection<GroupStyle> value) 
    { 
     obj.SetValue(GroupStyleProperty, value); 
    } 

    public static readonly DependencyProperty GroupStyleProperty = 
     DependencyProperty.RegisterAttached(
      "GroupStyle", 
      typeof(ICollection<GroupStyle>), 
      typeof(GroupStyleHelper), 
      new PropertyMetadata(null, OnGroupStyleChanged)); 

    private static void OnGroupStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ItemsControl itemsControl = d as ItemsControl; 
     if (itemsControl == null) 
      return; 

     RefreshGroupStyle(itemsControl, GetGroupStyle(itemsControl)); 
    } 

    private static void RefreshGroupStyle(ItemsControl itemsControl, IEnumerable<GroupStyle> groupStyle) 
    { 
     itemsControl.GroupStyle.Clear(); 

     if (groupStyle == null) 
      return; 

     foreach (var item in groupStyle) 
     { 
      itemsControl.GroupStyle.Add(item); 
     } 
    } 
} 

XAML Стиль:

<Style TargetType="ItemsControl"> 
     <Setter Property="GroupStyleTest:GroupStyleHelper.GroupStyle"> 
      <Setter.Value> 
       <GroupStyleTest:GroupStyleCollection> 
        <GroupStyle> 
         <GroupStyle.HeaderTemplate> 
          <DataTemplate> 
           <TextBlock FontWeight="Bold" FontSize="15" Text="{Binding Path=Name}" Foreground="HotPink"/> 
          </DataTemplate> 
         </GroupStyle.HeaderTemplate> 
        </GroupStyle> 
       </GroupStyleTest:GroupStyleCollection> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Отказ от ответственности: Я проверяю это в WPF, а не WinRT, но он должен работать так же, насколько я могу судить. Вот почему я использую ItemControl, а не GridView, но свойство ItemsControl.GroupStyle в любом случае.

+0

Спасибо! Хорошо выглядеть. Я сделаю это как можно скорее. – Mic

+0

Надеюсь, он работает в WinRT правильно для вас :-) –

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