Rat*_*eek 2 silverlight xaml silverlight-4.0
我正在尝试创建与ComboBoxes相关的Blend行为.为了获得我想要的效果,ComboBox的ItemsPanel必须添加一个元素.我不想在每个使用该行为的ComboBox中执行此操作,因此我希望Behavior能够以编程方式注入ItemsPanelTemplate.但是,我似乎找不到办法做到这一点.ItemsPanelTemplate似乎没有允许我设置可视树的属性/方法.WPF ItemsPanelTemplate具有VisualTree但Silverlight没有.
基本上,这个XAML的程序化等价物是什么?
<ComboBox>
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
编辑:
好吧,显然这不是一个简单的问题,所以我开始了一个赏金,我将提供更多的背景,以防有另一种方式来解决这个问题.我想为Silverlight ComoboBox提供键盘支持.开箱即用它只支持向上和向下箭头,但我也希望它能够工作,这样当用户点击一个字母时,ComboBox会跳转到该字母的第一项,类似于ComboBoxes在浏览器或Windows应用程序中的工作方式.
我发现这篇博文,让我走了一半路.调整该行为代码,ComboBox将根据字母输入更改选择. 但是,打开ComboBox时它不起作用.根据这篇博客文章的原因是,当打开ComboBox时,您现在正在与其ItemsPanel交互而不是ComboBox本身.所以根据那篇文章,我实际上需要将一个StackPanel添加到ItemsPanelTemplate并订阅StackPanel的KeyDown事件,以便在打开ComboBox时采取行动.
这就是我的问题,即如何从行为中将StackPanel放入ComboBox的ItemsPanelTemplate中.如果这是不可能的,有没有其他方法让这个工作?是的,我知道我可以去应用程序中的每个ComboBox并添加一个StackPanel和事件.但我想通过一个行为来做到这一点,这样我就不必修改应用程序中的每个ComboBox,因此我可以跨应用程序重用这个逻辑.
AnthonyWJones在下面使用XamlReader的回答让我有所帮助,因为我可以创建StackPanel并将其放入模板中.但是,我需要能够以编程方式获取该SP以订阅该事件.
这应该工作.我已经展示了如何改变下面的方向.您可以添加其他SetValue调用以修改其他属性.
cb.ItemsPanel = new ItemsPanelTemplate();
var stackPanelFactory = new FrameworkElementFactory(typeof (StackPanel));
// Modify it like this:
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
// Set the root of the template to the stack panel factory:
cb.ItemsPanel.VisualTree = stackPanelFactory;
Run Code Online (Sandbox Code Playgroud)
您可以在本文中找到更多详细信息:http://www.codeproject.com/KB/WPF/codeVsXAML.aspx
归档时间: |
|
查看次数: |
4024 次 |
最近记录: |