我也在更改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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)