2015-10-12 2 views
1

У меня есть сборка, где я определяю несколько элементов управления таможней (на основе существующего элемента управления) с их собственным стилем.Стиль, не работающий с пользовательским ListView

Для всех из них я определяю статический конструктор, где я устанавливаю DefaultStyleKeyProperty и добавляю файл стиля XAML в Themes/Generic.xaml.

Он работает отлично для всех из них, за исключением моего пользовательского ListView .. Это сводит меня с ума!

Вот краткий пример:

public class EmListView : ListView 
{ 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    static EmListView() 
    { 
     // Set the default style type 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(EmListView), new FrameworkPropertyMetadata(typeof(EmListView))); 
    } 
} 

XAML файл объявлен в Generic.xaml:

<Style TargetType="{x:Type ui:EmListView}"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="True"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ui:EmListView}"> 

       <Border Name="Border" Style="{DynamicResource EMLV_ListViewBorderStyle}" Margin="50"> 
        <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"> 
         <ItemsPresenter /> 
        </ScrollViewer> 
       </Border> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsGrouping" Value="true"> 
         <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
        </Trigger> 

        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Opacity" Value="0.3" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я не знаю, почему, но единственный способ, чтобы получить мой стиль применяется на моем EmListView чтобы заставить стиль при его использовании, как:

<ui:EmListView Margin="5" Style="{DynamicResource {x:Type ui:EmListView}}"> 

у меня есть EmWindow, EmButton, .. Все подают стиль автоматически, за исключением ListView. Есть ли что-то особенное в ListView?

спасибо.

EDIT:

я что-то заметил, что, кажется, что это заявление моего EmListView, которые вызывают тревогу.

Вот декларация образца внутри окна:

   <ui:EmListView Margin="5"> 
       <ui:EmListView.View> 
        <GridView> 

         <ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" /> 

         <ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" /> 

         <ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" /> 

         <ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" /> 

        </GridView> 
       </ui:EmListView.View> 
      </ui:EmListView> 

Стиль не применяется, и он постоянно кидать мне предупреждение о том, что он не может определить OverridesDefaultStyle собственности в стиле.

Если я просто объявить его как это:

<ui:EmListView Margin="5" /> 

У меня нет никакого предупреждения, и мой стиль установлен правильно.

ответ

1

я решил мою проблему, я сделал дерьмовый обходной путь в моей EmListView конструктору следующим образом:

public EmListView() 
    { 
     Style defaultStyle = (Style)Application.Current.TryFindResource(typeof(EmListView)); 
     if (defaultStyle != null) 
     { 
      this.OverridesDefaultStyle = true; 
      this.Style = defaultStyle; 
     } 
    } 

Если кто-то может сказать мне, почему я должен сделать этот трюк только для моего пользовательского элемента управления ListView я буду счастлив знать.

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