Windows Presentation Foundation或WPF是用于在基于Windows的应用程序中呈现用户界面的子系统。
如何在 ListBox 中的每个 ListBoxItem 之间放置分隔符?
这是我的 XAML: 这是我的 XAML: <ListBox Grid.Row="1" x:Name="lstGames" Background="#343434" > <ListBox.ItemTemplate> <DataTemplate> <Grid ShowGridLines="True"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Image Grid.Column="0" Source="{Binding ImageUrl}" Width="100"/> <StackPanel Grid.Column="1"> <StackPanel Orientation="Horizontal"> <TextBlock Text="Title:" /> <TextBlock Text="{Binding Title}" /> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Release Date:" /> <TextBlock Text="{Binding ReleaseDate}" /> </StackPanel> </StackPanel> </Grid> </DataTemplate> </ListBox.ItemTemplate> </ListBox> Sans 在 DataTemplate 中放置一个矩形并为其赋予颜色,ListBox 是否有某种方法可以在每个项目之间本机设置某些内容? 这是一个更好的例子,因为顶部没有分隔符 <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <StackPanel> <Separator x:Name="Separator"/> <ContentPresenter/> </StackPanel> <ControlTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}"> <Setter Property="Visibility" TargetName="Separator" Value="Collapsed"/> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> 这建立在 @EvaLacy 给出的答案的基础上,更加完整一些。 因为该答案替换了 ListBoxItem 的模板,所以它禁用了选择列表项时发生的内置突出显示(因为突出显示是通过原始模板中的触发器完成的)。要恢复此功能,请将默认触发器放入新模板中并稍微调整模板内容: <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <StackPanel> <Separator x:Name="Separator"/> <!-- Bind to parent properties --> <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True"> <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> </Border> </StackPanel> <ControlTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}"> <Setter Property="Visibility" TargetName="Separator" Value="Collapsed"/> </DataTrigger> </ControlTemplate.Triggers> <!-- Original Triggers --> <Trigger Property="Selector.IsSelected" Value="True"> <Setter TargetName="Bd" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelected" Value="True" /> <Condition Property="Selector.IsSelectionActive" Value="False"/> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> </MultiTrigger> <Trigger Property="UIElement.IsEnabled" Value="False"> <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> </Trigger> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> 我使用旧的但有用的向我展示模板应用程序检索了这些触发器。 我的解决方案: <Style x:Key="STYLE_ListBoxSubItem" TargetType="ListBoxItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter> <Setter Property="SnapsToDevicePixels" Value="true"/> <Setter Property="OverridesDefaultStyle" Value="true"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListBoxItem}"> <DockPanel LastChildFill="True"> <Separator x:Name="Separator" DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="2"/> <Border x:Name="Border" SnapsToDevicePixels="true"> <ContentPresenter VerticalAlignment="Center" /> </Border> </DockPanel> <ControlTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}"> <Setter Property="Visibility" TargetName="Separator" Value="Collapsed"/> </DataTrigger> <Trigger Property="IsSelected" Value="true"> <Setter TargetName="Border" Property="Background" Value="Orange"/> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="#888888"/> </Trigger> <Trigger Property="Control.IsMouseOver" Value="True"> <Setter TargetName="Border" Property="Background" Value="LightGray"></Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Usage --> <ListBox ItemContainerStyle="{StaticResource STYLE_ListBoxSubItem}"/> 您可以将分隔符的呈现移动到 ListBoxItem 控制模板中,如这个有意简化的示例所示: <Grid> <Grid.Resources> <PointCollection x:Key="sampleData"> <Point>10,20</Point> <Point>30,40</Point> <Point>50,60</Point> </PointCollection> </Grid.Resources> <ListBox ItemsSource="{StaticResource sampleData}"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <StackPanel> <Separator/> <ContentPresenter/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> 这将使分隔符远离您的项目模板。代价是您可能需要从默认的 ListViewItem 控件模板复制更多内容才能满足您的需求。当然,Separator 是可视化渲染分隔符的十几种方法之一。 我们现在已经到达 Avalonia 11,您不再需要覆盖默认模板(默认模板可能会随时更改,然后您的覆盖可能会中断)。您现在可以设置默认模板的某些元素的样式。 <ListBox ItemsSource="{Binding Documents}"> <ListBox.Styles> <Style Selector="ListBoxItem"> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0,0,0,1" /> <Style Selector="^:nth-child(1)"> <Setter Property="BorderThickness" Value="0,1,0,1" /> </Style> </Style> </ListBox.Styles> 这为每个 ListBoxItem 提供了 1 的下边框,除了第一个也有上边框。
如何从代码后面将边框背景更改为红色? 如何从代码后面将边框背景更改为红色? <Border Name="border_c" HorizontalAlignment="Left" VerticalAlignment="Top" CornerRadius="10" Width="180" Background="green"> 试试这个.. using System.Windows.Media; Border border = border_c; SolidColorBrush redBrush = new SolidColorBrush(Colors.Red); border.Background = redBrush; 或 border_c.Background = Brushes.Red;
WPF MVVM ComboBox SelectedItem 不会从 ViewModel 传播到 View
我有一个 MVVM 绑定的 ComboBox 我有一个 MVVM 绑定的 ComboBox <ComboBox ItemsSource="{Binding RootPathItems, Mode=OneTime}" DisplayMemberPath="DisplayName" SelectedItem="{Binding SelectedRootPathItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True"> </ComboBox> 组合框中的所有项目都是内存唯一的,并在窗口启动时创建。 当用户更改下拉列表中的选择时,将调用 ViewModel 属性设置器,并将正确的对象提供给设置器。然后我根据选择开始一些同步操作,然后然后我想将选择更改为默认选择 private RootPathItem _selectedRootPathItem; public RootPathItem SelectedRootPathItem { get => _selectedRootPathItem; set { if (_selectedRootPathItem != value) { _selectedRootPathItem = value; this.OnPropertyChanged(); SomeAction(); } } } ... //in SomeAction(): this.SelectedRootPathItem = _nothingComboBoxItem; .Net 内部将再次调用属性 getter 并获取 _nothingComboBoxItem,但 UI 将保留在之前选择的项目上,不会切换到默认值。 我也尝试绑定SelectedIndex,效果相同。 我的猜测是因为当我设置一个新项目时我仍然在属性设置器调用堆栈中,这不起作用,但我实际上不知道这里出了什么问题。 仔细查看您的代码库并对其进行测试,在我看来,您关于“仍在属性设置器理论中”的说法是正确的。看来 WPF 不会更新视图,除非您将 this.SelectedRootPathItem = _nothingComboBoxItem 行放入任务中。 而且我还看到您尝试使用交互行为来订阅 ComboBox 的选择更改事件,我认为这是一个比在属性设置器中做很多事情更清晰的方法。这个想法怎么了?我看到 xaml 代码被注释掉了。 我添加了nuget包,将交互行为代码放回xaml中,删除了setter中的_rootPathItemSelectionChangedCommand.Execute(null);行,它完美地工作了。
当我使用多重绑定时,转换器无法正常工作 公共部分类 TestControl : UserControl { 公共 TestClass TimeData{get;set;} 公共测试控制() {
在我的WPF应用程序中,我有一个自己创建的小部件(甘特图)。 这是甘特图主窗口中的InitializeUI(): 私有无效InitializeUI(){ 画布=新画布 {
WPF DataGrid - RowDetails DataContext
背景 我有以下 DataGrid,其中有两列用于描述和状态。它们绑定到一个名为 RowViewModels 的 ObservableCollection ,它作为 ...
在我的 WPF 应用程序中托管 Windows Shell 资源管理器
是否可以在 WPF 或 WinForms 窗口中嵌入 Windows 资源管理器文件/文件夹浏览器视图? 我基本上想将文件/文件夹浏览器作为我的应用程序窗口的一部分托管。我不想重新
WPF TreeView:ExpandAll() 方法在哪里
如何展开WPF中的所有TreeView节点?在 WinForms 中,有一个 ExpandAll() 方法可以执行此操作。
我有一个 BitmapImage 类型的可观察集合,其中存储了一些图像,该集合绑定到 UI。 现在的问题是,我想对这些图像进行更改,例如旋转......
我制作了一个关于电影和演员的 WPF 项目(编程新手)。 现在我可以通过输入他的名字、国家、生日等来手动创建一个新演员(链接到电影)。因为我添加了更多内容并且
我创建了 TextBox 类的派生类 MyTextBox,并添加了一个名为 AString 的依赖属性和一个名为 ContextChangedEvent 的路由事件。在XAML代码中,Text属性被绑定...
我在查找 style.xaml 资源时遇到问题,该资源包含按钮、文本框和其他元素的样式。该资源采用字典 XAML 的形式,位于...
我有两个项目的解决方案。一个是 Windows 服务,另一个是允许配置 Windows 服务应用程序的 WPF 应用程序。 我想发布这两个应用程序...
我正在使用 Blend Expression,并且刚刚开始使用 WPF。 我正在尝试制作一个窗口响应式窗口,它可以容纳多个网格,并将根据窗口大小重新调整大小到最小...
所以我之前的问题似乎无法回答,所以我将根据自己的建议尝试一下。 我正在寻找的功能是让数据网格改变前景(甚至
我正在尝试从一本旧书(Beginning Visual C# 2010)中学习 WPF。我尝试复制他们提供的示例(它看起来确实很可怕),但由于某种原因,文本不显示......
我正在 WPF 中创建一个基本的数据库应用程序,并且我已经开始使用 MVVM 模式。 我有一个对话框,要求用户从列表框中选择一个项目,然后单击“确定”。之后,我...
我不知道如何将饮料列表绑定到 WPF TreeView。 结构饮料 { 公共字符串名称{获取;私人套装; } 公共 int 流行度 { get;私人套装; } 公共饮料(字符串n...
学习 WPF 和 MVVM - 从头开始学习的最佳方法[已关闭]
我有大约三年的 c# 经验。我想学习一些 WPF 和 MVVM 模式。 该网站上有很多文章的链接,但我有点不知所措。 明智的
C# - WPF - DataGrid - 在列之间共享绑定
我将此类的实例绑定到 DataGrid 公开课 SomeClass { 公共 int m_width { 得到;放; } 公共 int m_height { 得到;放; } ... 公共字符串[] m_content { 获取;放; ...