是否有可能使RadComboBox的整个文本区域在拥有IsEditable=true和ReadOnly=True时可点击?
我只是将IsEditable = false设置为false,但不幸的是,我需要它是可编辑的,以便在选定某些内容时显示自定义文本(我已经设置了它,以便可以选择多个内容并显示所选项的列表)。如果禁用IsEditable,则会丢失.Text属性,无法设置自定义文本。
我最好的两个选择是:
1) somehow apply a style that makes the whole textbar clickable and not just the arrow
2) somehow apply custom text display when IsEditable is set to false.
不幸的是,我也不知道该怎么做,所以任何帮助都会很好。谢谢
编辑:这很理想,只是我们使用的是Silverlight,而不是ASP.net http://demos.telerik.com/aspnet-ajax/combobox/examples/functionality/checkboxes/defaultcs.aspx
这可能更现实,只是为了让文本区域可以点击,从而打开下拉菜单。就像右边的ComboBox,减去能够输入。
发布于 2014-10-10 23:42:01
最后我找到了一个其他人在这里实现的multiselectcombobox:
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自己的文本,所以当我们设置RadComboBox的文本时,TextBlock会更新自己。
这是我们最有效的方法,因为它需要最少的代码更改,并且没有结构更改,因为我们已经准备好了用于复选框和设置自定义文本的所有代码。
希望这能帮到别人,祝你好运!
发布于 2014-10-07 10:16:19
我能想到几个解决方案,不同的优雅。这里有一个可能适合于缩小箭头按钮和文本输入区域之间的差距。现在我想了想..。也许您可以通过OpenDropDownOnFocus
属性来消除这种非常难闻和脆弱的副作用(一旦单击不会改变焦点所有者,该属性就会中断)。
将MouseLeftButtonDown
单击处理程序注册到RadComboBox,您可以选择获取所有事件,而不仅仅是未处理的事件。然后我们可以从那里切换DropDown。但是我们不想干扰箭头按钮,因此我们检查鼠标点击的来源。
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;
}
}
https://stackoverflow.com/questions/26225869
复制相似问题