c# – WPF ListBoxItem ControlTemplate打破了一些MouseDownSelection

c# – WPF ListBoxItem ControlTemplate打破了一些MouseDownSelection,第1张

概述我有一个ListBoxItems的问题.我正在尝试使ListBoxItem中的所有控件也选择它,因此单击TextBox,Label等将选择ListBoxItem.到目前为止很简单. 我也在更改ListBoxItem模板以更改选择可视化,从突出显示背景到仅绘制边框.也很简单. 然而,这两者的结合似乎会导致MouseDown和PreviewMouseDown出现一些非常棘手的问题,特别是在我关于网格中 我有一个ListBoxItems的问题.我正在尝试使ListBoxItem中的所有控件也选择它,因此单击TextBox,Label等将选择ListBoxItem.到目前为止很简单.

我也在更改ListBoxItem模板以更改选择可视化,从突出显示背景到仅绘制边框.也很简单.

然而,这两者的结合似乎会导致MouseDown和PrevIEwMouseDown出现一些非常棘手的问题,特别是在我关于网格中标签的情况下,其中一个创建了一个由网格空间占据的“空白”.

使用snoop,我可以看到PrevIEwMouseDown事件在ListBox内的ScrollVIEwer处停止,而不是一直到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}">                                <@R_403_5559@ x:name="Bd"                                        @R_403_5559@Thickness="1">                                    <ContentPresenter />                                </@R_403_5559@>                                <ControlTemplate.Triggers>                                    <Trigger Property="IsSelected" Value="true">                                        <Setter Targetname="Bd" Property="@R_403_5559@Brush" 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;        }    }}

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

解决方法 如果您将标签的水平对齐方式从“左”更改为“拉伸”,这将解决问题并保持视觉格式相同.

Mousedown事件仅适用于存在元素的区域.通过使标签处于“左”水平对齐,您将创建您提到的“空白”,其中在该级别上不存在可以单击的元素.若要直观地看到差异,请尝试临时设置给您带来问题的标签元素的背景属性,并且您将看到该元素不会一直延伸到文本框.

总结

以上是内存溢出为你收集整理的c# – WPF ListBoxItem ControlTemplate打破了一些MouseDown / Selection全部内容,希望文章能够帮你解决c# – WPF ListBoxItem ControlTemplate打破了一些MouseDown / Selection所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1246654.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存