Шаблон Silverlight TabItem работает неправильно

В приложении SL4 мне нужно изменить стиль моих TabItems (фактически добавить кнопку в заголовок).

Поэтому я взял шаблон элемента управления TabItem из здесь и добавил функциональность, которую я хотел.

Кажется, это работает нормально (я мог динамически добавлять вкладки) за одним исключением: я думаю, что этот опубликованный шаблон управления ведет себя как-то «произвольно»: каждый раз, когда мышь наводит курсор мыши на невыбранный заголовок TabItem, он выбирается БЕЗ щелчка!! (на самом деле это не поведение по умолчанию: пользователь должен щелкнуть заголовок, чтобы сделать этот табулятор выбранным).

Я пытался найти, почему он так себя ведет, но безуспешно! Есть ли кто-нибудь, кто может просветить мою тьму???

Заранее спасибо!


person Savvas Sopiadis    schedule 20.04.2010    source источник


Ответы (1)


Оказывается, ошибка была не в шаблоне элемента управления, а в классе, к которому был применен стиль.

Подробно: класс, к которому был применен стиль, следующий (в нем вы увидите мой комментарий о "неправильном поведении"):

открытый класс WorkspaceViewModel: TabItem {

    public WorkspaceViewModel()
    {
        DefaultStyleKey = typeof(WorkspaceViewModel);
    }
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        Button closeButtonSel = base.GetTemplateChild("PART_CloseTopSelected") as Button;
        Button closeButtonUnsel = base.GetTemplateChild("PART_CloseTopUnSelected") as Button;
        if (closeButtonSel != null)
            closeButtonSel.Click += new RoutedEventHandler(closeButtonSel_Click);
        if (closeButtonUnsel != null)
            closeButtonUnsel.Click += new RoutedEventHandler(closeButtonSel_Click);

        //this part is causing the effect i was complaining about!
        //and has to be removed
        this.MouseEnter += delegate(object sender, MouseEventArgs e)
        {
            IsSelected = true;
        };


    }

    void closeButtonSel_Click(object sender, RoutedEventArgs e)
    {
        //this is the close request method used in the CloseTabItemCommand
        OnRequestClose();

    }


    #region CloseTabItemCommand

    private RelayCommand closeTabItemCommand;
    public ICommand CloseTabItemCommand
    {
        get
        {
            if (this.closeTabItemCommand == null)
                this.closeTabItemCommand = new RelayCommand(p => this.OnRequestClose(), p => this.CanCloseTabItem());

            return this.closeTabItemCommand;
        }
    }
    private bool CanCloseTabItem()
    {
        return true;
    }

    public event EventHandler RequestClose;
    private void OnRequestClose()
    {
        if (RequestClose != null)
            RequestClose(this, EventArgs.Empty);
    }
    #endregion
}
person Savvas Sopiadis    schedule 21.04.2010