我对ListBoxItem有问题。我试图使ListBoxItem中的所有控件也都选择它,因此单击TextBoxLabel等将选择ListBoxItem。到目前为止非常简单。

我还更改了ListBoxItem模板,以将选择可视化从突出显示背景更改为仅绘制边框。也很简单。

但是,这两者的结合似乎会导致MouseDownPreviewMouseDown出现一些真正令人烦恼的问题,特别是在我的情况下,是关于Label中的Grid,其中一个会创建一个由Grid空间占据的“空”。

使用snoop,我可以看到PreviewMouseDown事件停止在ScrollViewer内的ListBox处,而没有一直到ListBoxItem

XAML:

<Window x:Class="ListBoxClickThroughTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="525"
        Height="350">
    <Grid>
        <ListBox ItemsSource="{Binding Items}"
                 SelectionMode="Single">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>

                        <Label Name="VerySuperLongLabel"
                               Grid.Row="0"
                               Grid.Column="0"
                               HorizontalAlignment="Left"
                               Content="VerySuperLongLabel"
                               Padding="0" />

                        <TextBox Name="Textbox1"
                                 Grid.Row="0"
                                 Grid.Column="1"
                                 HorizontalAlignment="Stretch"
                                 HorizontalContentAlignment="Right"
                                 Text="Textbox1 Text" />


                        <Label Name="ShortLabel"
                               Grid.Row="1"
                               Grid.Column="0"
                               HorizontalAlignment="Left"
                               Content="ShortLabel"
                               Padding="0" />
                        <TextBox Name="Textbox2"
                                 Grid.Row="1"
                                 Grid.Column="1"
                                 HorizontalAlignment="Stretch"
                                 HorizontalContentAlignment="Right"
                                 Text="Textbox2 Text" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>

            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <EventSetter Event="PreviewMouseDown"
                                 Handler="ListBoxItem_PreviewMouseDown" />
                    <EventSetter Event="MouseDown"
                                 Handler="ListBoxItem_PreviewMouseDown" />
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <Border x:Name="Bd"
                                        BorderThickness="1">
                                    <ContentPresenter />
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="true">
                                        <Setter TargetName="Bd" Property="BorderBrush" Value="Gray" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>

    </Grid>
</Window>

后台代码:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace ListBoxClickThroughTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            Items = new List<string>() { "1", "2" };
            InitializeComponent();
            DataContext = this;
        }

        public List<string> Items { get; set; }

        private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            var listBoxItem = (ListBoxItem)sender;
            listBoxItem.IsSelected = true;
        }
    }
}

但是,如果我删除Template setter,一切都很好。我缺少的模板中有魔术吗?我尝试将边框重命名为“Bd”,因为这是默认模板边框的名称,但是没有运气。有任何想法吗?

最佳答案

如果将标签的水平对齐方式从“左”更改为“拉伸(stretch)”,这将解决问题并保持视觉格式不变。

Mousedown事件仅在元素存在的区域起作用。通过使标签处于“左侧”水平对齐方式,可以创建您提到的“void”,在该层次上没有可以单击的元素。要直观地看到差异,请尝试临时设置给您带来问题的label元素的background属性,您会看到该元素并未一直延伸到文本框。

关于c# - WPF ListBoxItem ControlTemplate中断了某些MouseDown/选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30715116/

10-10 23:32