WPF: сохранение стиля по умолчанию при наследовании от ListBoxItem - PullRequest
1 голос
/ 14 марта 2011

Привет, ребята (и девочки, если таковые имеются)

Мне нужна была другая политика выбора списка, чем та, которая предусмотрена по умолчанию для списков WPF, то есть возможность иметь расширенный выбор без любой клавиши-модификатора.

Нет проблем, вот что я сделал:

class EnhancedCcyPairListBox : ListBox
{

    protected override DependencyObject GetContainerForItemOverride()
    {
        return new CcyPairListBoxItem();
    }

}

internal class CcyPairListBoxItem : ListBoxItem
{
    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        IsSelected = !IsSelected;

        e.Handled = true;
    }
}

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

Кроме того ... тем самым я утратил стиль по умолчанию ListBoxItem, который у меня был до этого.Как я могу сказать своим производным классам сохранить их стиль по умолчанию?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 марта 2011

Поскольку WPF-контекст нашего приложения довольно специфичен, я хотел быть уверен, что это не очень специфическая проблема.

Итак, я взял два вышеупомянутых класса и импортировал их в новый тестовый проект WPF. Я создал каталог Темы, в котором был зарегистрирован словарь ресурсов, в который я поместил стиль как NVM, упомянутый ранее.

Project structure

Содержимое Generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/InheritedListBoxStyling;component/Themes/Styles/TempDic.xaml" />
    <!-- Reference here the Resource dictionnary used for your own component -->
</ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

Содержимое TempDic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:InheritedListBoxStyling="clr-namespace:InheritedListBoxStyling">

<Style TargetType="{x:Type InheritedListBoxStyling:CcyPairListBoxItem}"        
       BasedOn="{StaticResource {x:Type ListBoxItem}}"/>

</ResourceDictionary>

Содержимое Window1.xaml.cs

namespace InheritedListBoxStyling
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            DataContext = this;
            for (int i = 0; i < 50; i++)
            {
                source.Add("toto " + i);
            }

            l1.ItemsSource = source;
            l2.ItemsSource = source;
        }

        public ObservableCollection<string> source = new ObservableCollection<string>();
    }
}

Содержимое Window1.xaml:

<Window x:Class="InheritedListBoxStyling.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:InheritedListBoxStyling="clr-namespace:InheritedListBoxStyling" 
    Title="Window1" Height="300" Width="300">
    <Grid>

        <ListBox x:Name="l1" SelectionMode="Extended" 
             Margin="0,0,12,12"  Height="100" 
             HorizontalAlignment="Right" 
             VerticalAlignment="Bottom" Width="120" />
        <InheritedListBoxStyling:EnhancedCcyPairListBox 
            x:Name="l2" SelectionMode="Extended" 
            Height="100" Margin="12,12,0,0" 
            VerticalAlignment="Top" 
            HorizontalAlignment="Left" Width="120" />
    </Grid>
</Window>

А вот и результат:

Sample App

=> стиль по умолчанию не применяется, и, как и в моей проблеме «реального случая», единственным видом стиля, который, кажется, применяется, является серый выбранный стиль элемента.

Есть идеи о том, что происходит или что я делаю неправильно?

0 голосов
/ 14 марта 2011

Добавьте это выше объявления EnhancedCcyPairListBox

    [StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(CcyPairListBoxItem))]

Редактировать

Добавьте это в статический конструктор CcyPairListBoxItem "

            DefaultStyleKeyProperty.OverrideMetadata(
            typeof(CcyPairListBoxItem), new FrameworkPropertyMetadata(typeof(CcyPairListBoxItem)));

и в Themes / Generic.xamlдобавить

<Style TargetType="{x:Type CcyPairListBoxItem}"
       BasedOn="{StaticResource {x:Type ListBoxItem}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...