Шаблон Silverlight TabItem не работает правильно - PullRequest
0 голосов
/ 20 апреля 2010

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

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

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

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

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

1 Ответ

0 голосов
/ 21 апреля 2010

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

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

открытый класс 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
}
...