在Xaml(Silverlight)中选择项目时设置组合框的VisualState

时间:2013-12-31 18:25:35

标签: silverlight xaml combobox

当我的组合框扩展并选择一个项目时,我希望组合框改变视觉状态(突出显示)。这将表示选择了某些内容。我尝试了各种VisualStates,但在这种情况下没有一个会触发。我怎样才能做到这一点?感谢。

1 个答案:

答案 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样式的默认样式(或者你通常使用的任何样式)。

请注意,我没有以任何方式对此进行测试。