- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试为我正在处理的应用程序创建一个用户控件。它基本上是 ComboBox
旁边的 ToggleButton
。在 VS2015 中,我几乎可以按照设计人员想要的方式模拟用户控件的 ComboBox
部分,但我觉得我的处理方式并不是最好的方式。
首先,这是一个链接,指向它的外观截图: https://www.dropbox.com/s/019f4xqgu8r4i0e/DropDown.png
为此,我最终创建了 3 种不同的 ComboBoxItem
样式。第一个将一个 CheckBox
、一个带有 ContentPresenter
的 TextBlock
和一个 Rectangle
放在一起。第二个只有一个 Separator
,最后一个只有 TextBlock
和 ContentPresenter
。这是我的 XAML,它在 UserControl.Resources
部分声明:
<Style x:Key="cbTestStyle" TargetType="{x:Type ComboBoxItem}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBoxItem">
<Border Name="Border"
Padding="5"
Margin="2"
BorderThickness="2"
CornerRadius="0"
BorderBrush="Transparent">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="75"/>
<ColumnDefinition Width="15"/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0"
IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}}"/>
<TextBlock Grid.Column="1"
TextAlignment="Left"
Foreground="Black">
<ContentPresenter/>
</TextBlock>
<Rectangle Grid.Column="2"
Stroke="Black"
Width="15"
Height="15"
Fill="{TemplateBinding Foreground}"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="True">
<Setter TargetName="Border" Property="BorderBrush" Value="Gray"/>
<Setter TargetName="Border" Property="Background" Value="LightGray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="cbSeparatorStyle" TargetType="ComboBoxItem">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Separator/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="cbResetStyle" TargetType="{x:Type ComboBoxItem}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBoxItem">
<Border x:Name="Border"
Padding="5"
Margin="2"
BorderThickness="2"
CornerRadius="0"
BorderBrush="Transparent">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1">
<ContentPresenter/>
</TextBlock>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="True">
<Setter TargetName="Border" Property="BorderBrush" Value="Gray"/>
<Setter TargetName="Border" Property="Background" Value="LightGray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我想我的第一个问题是,这是使我的 ComboBox
看起来像我提供的屏幕截图的最佳方式吗?
当然,还有更深层次的问题我还没有解决。首先,我希望能够动态填充 ComboBoxItem
的 cbTestStyle
。数据绑定(bind)显然是我的首选,但最后有分隔符和“重置”样式,我不确定该怎么做。我目前在 XAML 中对 ComboBoxItem
进行了“硬编码”:
<ComboBox x:Name="cbTestSelect"
Height="34"
Width="18"
IsEnabled="False">
<ComboBoxItem Style="{StaticResource cbTestStyle}" Content="Test 1" Foreground="#7FFF0000" Selected="ComboBoxItem_Selected"/>
<ComboBoxItem Style="{StaticResource cbTestStyle}" Content="Test 2" Foreground="#7F00FF00" Selected="ComboBoxItem_Selected"/>
<ComboBoxItem Style="{StaticResource cbTestStyle}" Content="Test 3" Foreground="#7F0000FF" Selected="ComboBoxItem_Selected"/>
<ComboBoxItem Style="{StaticResource cbSeparatorStyle}"/>
<ComboBoxItem Style="{StaticResource cbResetStyle}" Content="Reset all"/>
</ComboBox>
在此示例中,理想情况下,我希望动态创建前三个项目,并让分隔符和“重置”项目保持静态。我对 WPF 还是比较陌生。我觉得尝试在 WinForms 中创建此控件(此用户控件将用于其中的应用程序)会复杂得多。另外,我正试图引导我们更多地使用 WPF。
任何帮助或指向其他问题或在线教程的链接将不胜感激。
最佳答案
解决方案一:
使用 CompositeCollection
这样您就可以使用 DataBinding 调出数据项,并使用常规 XAML 来定义硬编码项:
<Window x:Class="WpfApplication31.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication31"
Title="MainWindow" Height="350" Width="525"
x:Name="view">
<Window.Resources>
<DataTemplate DataType="{x:Type local:DataItem}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding Text}"/>
<Rectangle Stroke="Black" StrokeThickness="1"
Fill="{Binding Color}" Width="20"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ComboBox VerticalAlignment="Center"
HorizontalAlignment="Center"
Width="100" x:Name="Combo">
<ComboBox.Resources>
<CompositeCollection x:Key="ItemsSource">
<CollectionContainer Collection="{Binding DataContext,Source={x:Reference view}}"/>
<Separator Height="10"/>
<Button Content="Clear All"/>
</CompositeCollection>
</ComboBox.Resources>
<ComboBox.ItemsSource>
<StaticResource ResourceKey="ItemsSource"/>
</ComboBox.ItemsSource>
</ComboBox>
</Grid>
</Window>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new[] {"Red", "Green", "Blue", "Brown", "Cyan", "Magenta"};
this.DataContext =
Enumerable.Range(0, 5)
.Select(x => new DataItem
{
Text = "Test" + x.ToString(),
Color = colors[x],
IsChecked = x%2 == 0
});
}
}
数据项:
public class DataItem
{
public bool IsChecked { get; set; }
public string Text { get; set; }
public string Color { get; set; }
}
结果:
关于c# - 在一个 WPF ComboBox 中使用三种不同的 ComboBoxItem 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058502/
我的项目中有以下ComboBox,但是如果我这样写的话,很困扰我:
我的目标是拥有一个 ComboBox,其中每个下拉项目都有一个特定的文本和一个与之关联的特定项目,例如,如果有人点击“blah” - 所选项目将是 3. 据我所知 - 只有一个“内容”同时代表文本和值
我希望我的 ComboBox 像这样在多个列中显示 ComboBoxItem: 谁能告诉我该怎么做? 我可以用这个:
加载控件时,我的组合框项目选择中的内容未显示在组合框中。它在我鼠标悬停后出现,然后开始工作。 这是默认选中的组合框项目
我正在处理通常包含大量数据的 ComboBox 元素; ~250000 个数据条目。 当 ComboBox 像这样设置时,这会很好地工作。
我有一个小应用程序,其中相同的 ComboBox 出现在多个位置,并且它始终具有相同的项目集。而不是每次我使用组合框时都这样做: 我在想最好让项目成为我可以
我想为 PASS 设置文本颜色如 GREEN和 FAIL 的文本颜色如 RED .我似乎无法找到解决方案。我需要在纯 XAML 中执行此操作。 最
我正在尝试以编程方式填充 ComboBox。我正在创建 ComboBoxItems 并想设置它们的文本(对最终用户可见的文本)和它们的值(用户选择它后我将在后台处理的对象。 然而,ComboBoxIt
我目前有一个如下所示的组合框: //XAML Awake & Alive 这会引发错误:以与符号“&”开头的实体引用或序列必须以分号“;”终止。 我假设我缺少某种转义序列以允许我使用 &。如何设
如何从 SmartGWT ComboBoxItem 获取所有记录? 我将记录添加为数据源。没有找到任何方法来检索所有记录。 提前谢谢您! 最佳答案 尝试 RecordList recordList=c
在下拉菜单中我得到这样的结果。找到附件图片。实际上,在“名称”字段中,“名称”和“描述”都显示为逗号(,)分隔。 final ComboBoxItem comboBoxItem = new Combo
我有一个看起来像这样的样式: var comboBoxItemStyle = new Style(typeof(ComboBoxItem)); comboBoxItemStyle.Setters.Ad
您好,我刚刚构建了一个小型转换计算器,我在其中添加了一个组合框,因此它不会那么困惑且易于管理。我不会向我的组合框添加一些选项,以便用户有不同的选项可供选择。但是,我将构建一个带有转换计算的小类,以便在
我有一个绑定(bind)到 ObservableCollection 的 ComboBox:
我有以下示例代码。奇怪的是,MouseMove 事件正确触发,但是当替换为 MouseEnter 时,当鼠标移到 ComboBoxItem 上时没有任何反应。知道如何解决这个问题吗?我实际上需要在用户
我有一个使用 DataTemplate 的 ListBox。单个 ListBoxItems 显示为 TextBlock 和 ComboBox。我现在想为 ListBoxItems 使用 Style,而
我正在使用标准的 wpf/mvvm 应用程序,我将组合框绑定(bind)到 ViewModel 上的集合。 我需要能够从下拉列表中取消选择一个项目。意思是,用户应该能够选择一些东西,然后决定他们想要取
如何获取 ComboBoxItem 的 ParentComboBox? 如果按下 Insert-Key,我想关闭一个打开的 ComboBox: var focusedElement = Keyboa
我需要找到 ComboBoxItem 所在的 ComboBox。 在代码隐藏中,我在单击 ComboBoxItem 时捕获了一个事件,但我不知道特定 ComboBoxItem 属于几个 ComboBo
我正在尝试在 smartgwt 的 ComboBoxItem 中添加带有 null 值的空白行,该值已绑定(bind)到来自数据库的数据源。 我也尝试过服务层、 Controller 层和数据库的改变
我是一名优秀的程序员,十分优秀!