1

嘿伙计们(和女孩,如果有的话:)

我需要一种与 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 样式。如何告诉我的派生类保持其默认样式?

非常感谢 !

4

2 回答 2

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}}"/>
于 2011-03-14T13:11:30.727 回答
0

因为我们的应用程序的 WPF 上下文非常特殊,所以我想确定这不是一个非常具体的问题。

所以我把上面的两个类,导入到一个全新的WPF测试项目中。我创建了一个主题目录,该目录注册了一个资源字典,其中我将 Style 作为 NVM 放在前面提到的。

项目结构

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>

结果在这里:

示例应用

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

关于发生了什么或我做错了什么的任何想法?

于 2011-03-14T17:03:58.607 回答