WPF:从ListBoxItem继承时保持默认样式

时间:2011-03-14 13:04:04

标签: wpf listbox listboxitem multipleselection

Hey Guys(和女孩,如果有的话):

我需要一个不同于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 :(得分:0)

在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}}"/>

答案 1 :(得分:0)

因为我们的应用程序的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

=&GT;默认样式未应用,并且在我的“真实案例”问题中,似乎应用的唯一样式是灰色选定项目样式。

对于发生了什么或我做错了什么?