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

在Xaml(Silverlight)中选择项目时设置组合框的VisualState,silverlight,xaml,combobox,Silverlight,Xaml,Combobox,当我的组合框展开并选择一个项目时,我希望组合框更改视觉状态,并高亮显示。这将表示选择了某个对象。我尝试了各种VisualState,但在这种情况下它们都不会触发。我怎样才能做到这一点?谢谢。标准组合框没有状态来区分选择了什么和没有选择什么 解决根本问题的方法有很多,主要取决于以下问题的答案: 您真的需要更改组合框本身的视觉外观吗?还是只需更显著地设置所选项目的样式就足够了 如果是后者,最好使用ComboBoxItems自定义控件模板的简单方法 如果您真的希望以这种方式设置组合框本身的样式,我可以

当我的组合框展开并选择一个项目时,我希望组合框更改视觉状态,并高亮显示。这将表示选择了某个对象。我尝试了各种VisualState,但在这种情况下它们都不会触发。我怎样才能做到这一点?谢谢。

标准组合框没有状态来区分选择了什么和没有选择什么

解决根本问题的方法有很多,主要取决于以下问题的答案:

您真的需要更改组合框本身的视觉外观吗?还是只需更显著地设置所选项目的样式就足够了

如果是后者,最好使用ComboBoxItems自定义控件模板的简单方法

如果您真的希望以这种方式设置组合框本身的样式,我可以考虑以下两个选项:

使用自定义模板将自定义状态添加到组合框

复制组合框的控件模板,并将另一个状态组添加到已存在的状态。这两种操作通常在Expression Blend中完成

之后,您可以使用更新代码中的新状态

VisualStateManager.GoToState(this, "Selected", true);
比如说。选择第一项时,您必须自己设置这些状态。这可以在SelectionChanged事件上完成

B从组合框派生

如果您想经常以这种方式使用该控件,那么从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);
    }
}
然后,您需要一个基于默认组合框样式或您通常使用的任何样式的默认样式

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