В настоящее время я создаю ComboBox
меню, которое будет использоваться с TextBox
и кнопкой, которая открывает выбор. Пока что меню работает, как и ожидалось, но элементам не хватает визуальных эффектов, которые они имеют при помещении в ComboBox
, что означает, например, что я ожидаю, что стиль отображения и фон выбранного элемента изменятся.
Пока что я Попытка использовать шаблон контейнера элемента ComboBox
вместо ComboBoxItemRevealStyle
для ComboBoxItem
, но это не имеет значения. Кроме того, текущее визуальное состояние предмета всегда кажется null
, поэтому у меня такое ощущение, что все это нужно делать вручную ...
Мой вопрос: я что-то пропустил или сделал Мне нужно что-то добавить, чтобы сделать эту работу, или мне нужно создать новый контейнерный элемент управления, который управляет всем визуальным материалом, для этой цели?
Следующий код сокращен для краткости.
ComparisoonTextBox.xaml:
<UserControl
x:Class="Controls.ComparisonTextBox"
x:Name="ControlRoot"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="32"
d:DesignWidth="200">
<Grid>
<Button x:Name="OperatorButton"
VerticalAlignment="Stretch"
HorizontalAlignment="Left"
Width="40"
BorderThickness="2,2,0,2"
Content="{Binding SelectedOperator, ElementName=ControlRoot}" />
<Popup x:Name="OperatorPopup" IsLightDismissEnabled="True" Margin="0,-7,0,0">
<Border x:Name="PopupBorder"
Background="{ThemeResource ComboBoxDropDownBackground}"
BorderThickness="{ThemeResource ComboBoxDropdownBorderThickness}"
BorderBrush="{ThemeResource ComboBoxDropDownBorderBrush}"
HorizontalAlignment="Stretch"
Margin="0,-1,0,-1">
<ScrollViewer x:Name="ScrollViewer"
AutomationProperties.AccessibilityView="Raw"
Foreground="{ThemeResource ComboBoxDropDownForeground}"
HorizontalScrollBarVisibility="Hidden"
HorizontalScrollMode="Disabled"
IsDeferredScrollingEnabled="True"
IsHorizontalRailEnabled="False"
IsVerticalRailEnabled="True"
MinWidth="50"
VerticalSnapPointsType="OptionalSingle"
VerticalScrollMode="Enabled"
VerticalScrollBarVisibility="Auto"
VerticalSnapPointsAlignment="Near"
ZoomMode="Disabled">
<ItemsControl x:Name="OperatorItems"
Margin="{ThemeResource ComboBoxDropdownContentMargin}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ComboBoxItem Style="{ThemeResource ComboBoxItemRevealStyle}"
Tapped="OperatorItemTapped">
<TextBlock Text="{Binding }" />
</ComboBoxItem>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</Popup>
</Grid>
</UserControl>
ComparisonTextBox.xaml.cs:
namespace Controls
{
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
/// <summary>
/// Defines a numeric input control with a button that allows to
/// select a <see cref="Operator"/> for further comparison operations.
/// </summary>
public sealed partial class ComparisonTextBox : UserControl
{
private ComboBoxItem selectedItem;
/// <summary>
/// Identifies the <see cref="SelectedOperatorProperty"/> dependency property.
/// </summary>
public static DependencyProperty SelectedOperatorProperty =
DependencyProperty.Register(
nameof(SelectedOperator),
typeof(Operator),
typeof(ComparisonTextBox),
new PropertyMetadata(Operator.Equals));
/// <summary>
/// Gets or sets the selected comparison operator to use.
/// </summary>
public Operator SelectedOperator
{
get => (Operator)GetValue(SelectedOperatorProperty);
set => SetValue(SelectedOperatorProperty, value);
}
/// <summary>
/// Initializes a new instance of the <see cref="ComparisonTextBox"/> class.
/// </summary>
public ComparisonTextBox()
{
InitializeComponent();
OperatorButton.Click += OperatorButtonClick;
foreach (var comparisonOperator in Enum.GetValues(typeof(Operator)))
{
OperatorItems.Items.Add(comparisonOperator);
}
}
private void OperatorItemTapped(object sender, TappedRoutedEventArgs e)
{
var comboBoxItem = (ComboBoxItem)sender;
comboBoxItem.IsSelected = true;
SelectedOperator = (Operator)comboBoxItem.DataContext;
if (!(selectedItem is null))
selectedItem.IsSelected = false;
selectedItem = comboBoxItem;
OperatorPopup.IsOpen = false;
}
private void OperatorButtonClick(object sender, RoutedEventArgs e)
{
OperatorPopup.IsOpen = true;
}
}
}
Operator.cs:
using System.ComponentModel;
/// <summary>
/// Defines comparison operators.
/// </summary>
public enum Operator
{
[DisplayName(">")]
Greater,
[DisplayName(">=")]
GreaterEqual,
[DisplayName("=")]
Equals,
[DisplayName("<=")]
LessEqual,
[DisplayName("<")]
Less
}