当我的组合框扩展并选择一个项目时,我希望组合框改变视觉状态(突出显示)。这将表示选择了某些内容。我尝试了各种VisualStates,但在这种情况下没有一个会触发。我怎样才能做到这一点?感谢。
答案 0 :(得分:0)
标准的ComboBox根本没有状态来区分选择的内容和没有选择的内容。
解决潜在问题有很多方法,主要取决于以下问题的答案:
您是否真的需要更改ComboBox本身的视觉外观,或者是否足以更加突出显示所选项目的样式?
如果是后者,那么最好使用为ComboBoxItems使用自定义控件模板的相当简单的方法。
如果你真的想以这种方式设计ComboBox本身,我可以想到两个选项:
A)使用自定义模板向ComboBox添加自定义状态。
复制ComboBox的控件模板,并将另一个状态组添加到已存在的状态。这两者通常都在Expression Blend中完成。
之后,您可以使用
更新代码中的新状态VisualStateManager.GoToState(this, "Selected", true);
例如,。选择第一项时,您必须自己设置这些状态。这可以在SelectionChanged事件上完成。
B)从ComboBox派生
如果你想经常以这种方式使用控件,可能值得从ComboBox派生来制作你自己的自定义控件。
看起来像这样:
[TemplateVisualState(Name = "SelectedStates", GroupName = "Unselected")]
[TemplateVisualState(Name = "SelectedStates", GroupName = "Selected")]
// ... (more attributes copied from the ComboBox ones)
public class MyComboBox : ComboBox
{
public MyComboBox()
{
SelectionChanged += HandleSelectionChanged;
DefaultStyleKey = typeof(MyComboBox);
}
void HandleSelectionChanged(object sender, SelectionChangedEventArgs e)
{
VisualStateManager.GoToState(this, SelectedItem != null ? "Selected" : "Unselected", true);
}
}
然后你需要一个基于默认ComboBox样式的默认样式(或者你通常使用的任何样式)。
请注意,我没有以任何方式对此进行测试。