在IsEditable = true和ReadOnly = True的情况下,是否可以使RadComboBox的整个文本区域可单击?
我只想设置IsEditable = false但不幸的是我需要它才能被编辑以便在选择某些内容时显示自定义文本(我已经设置了这样可以选择多个内容并显示所选项目的列表)。如果我禁用IsEditable,那么我将丢失.Text属性,并且无法设置自定义文本。
我最好的两个赌注是:
1)以某种方式应用一种风格,使整个文本栏可以点击而不仅仅是箭头
2)当IsEditable设置为false时,以某种方式应用自定义文本显示。
不幸的是我不知道怎么做,所以任何帮助都会很好。感谢
编辑:这是理想的,除了我们使用的是Silverlight而不是ASP.net
http://demos.telerik.com/aspnet-ajax/combobox/examples/functionality/checkboxes/defaultcs.aspx
这可能更现实,只是以某种方式使文本区域可点击,以便打开下拉菜单。就像右边的ComboBox一样,减去能够打字。
http://demos.telerik.com/aspnet-ajax/combobox/examples/functionality/comboboxvsdropdownlist/defaultcs.aspx
答案 0 :(得分:0)
我可以想到几种不同优雅的解决方案。这可能适合关闭Arrow-ToggleButton和Text-Input-Area之间的剩余间隙。现在,我想到了......也许你可以摆脱那个相当臭和脆弱的副作用 - 搭载OpenDropDownOnFocus
属性(一旦点击不会改变焦点所有者就会中断)
使用RadComboBox注册MouseLeftButtonDown
点击处理程序,您可以选择所有事件,而不仅仅是未处理的事件。然后我们可以从那里切换DropDown。但是我们不想干扰Arrow-ToggleButton,因此我们会检查鼠标点击的来源。
public class MyView : UserControl
{
public MyView()
{
InitializeComponent();
MouseButtonEventHandler handler = OnComboBoxClicked;
radComboBox.AddHandler( UIElement.MouseLeftButtonDownEvent, handler,
handledEventsToo: true );
}
private void OnComboBoxClicked( object sender, MouseButtonEventArgs args )
{
if (!args.Handled ||
!args.IsRoutedEventFromToggleButton(
togglebuttonAncestorToStopTheSearch: (UIElement) sender))
{
ToggleDropDown();
}
}
}
和更容易使用的扩展方法:
public static class ControlExtensions
{
public static bool IsRoutedEventFromToggleButton(
this RoutedEventArgs args,
UIElement togglebuttonAncestorToStopTheSearch )
{
ToggleButton toggleButton = ((UIElement) args.OriginalSource)
.GetAncestor<ToggleButton>( togglebuttonAncestorToStopTheSearch );
return toggleButton != null;
}
public static TAncestor GetAncestor<TAncestor>(
this DependencyObject subElement,
UIElement potentialAncestorToStopTheSearch )
where TAncestor : DependencyObject
{
DependencyObject parent;
for (DependencyObject subControl = subElement; subControl != null;
subControl = parent)
{
if (subControl is TAncestor) return (TAncestor) subControl;
if (object.ReferenceEquals( subControl,
potentialAncestorToStopTheSearch )) return null;
parent = VisualTreeHelper.GetParent( subControl );
if (parent == null)
{
FrameworkElement element = subControl as FrameworkElement;
if (element != null)
{
parent = element.Parent;
}
}
}
return null;
}
}
答案 1 :(得分:0)
我最终找到了其他人在这里实施的多选组合框:
http://www.telerik.com/support/code-library/a-multiselect-combobox
我不需要整个组合框本身,因为我们已经实现了一个,所以我只是看看这个人在组合框IsEditable设置为false时如何显示自定义消息。
看了那段代码后,看看我怎么能让它适合我,我把
<ucControls:RadComboBox.SelectionBoxTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text,ElementName=RadCombo}" />
</DataTemplate>
</ucControls:RadComboBox.SelectionBoxTemplate>
在我们自己的自定义MultiSelectComboBox的XAML中。 ( RadCombo 是我希望将文本链接到的特定控件的名称)
<ucControls:RadComboBox
x:Name="RadCombo"
Text=""
........
<强> <ucControls:RadComboBox.SelectionBoxTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text,ElementName=RadCombo}" />
</DataTemplate>
</ucControls:RadComboBox.SelectionBoxTemplate>
强>
.......
</ucControls:RadComboBox>
使用内置的SelectionBoxTemplate,这基本上只是添加了一个TextBlock叠加层,内容被绑定到RadComboBox自己的Text,所以当我们设置RadComboBox的Text时,TextBlock会自行更新。 / p>
这是我们这样做的最有效方式,因为它需要最少的代码更改,并且没有结构更改,因为我们已经为检查框和设置自定义文本准备了所有代码。
希望这有助于某人,祝你好运!