Поиск элементов управления в WPF ControlTemplate - PullRequest
3 голосов
/ 07 апреля 2011

Я создал класс, который наследуется от Window, и я применяю к нему шаблон управления:

public class BaseSearchWindow : Window {
        static BaseSearchWindow() {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(BaseSearchWindow), new FrameworkPropertyMetadata(typeof(BaseSearchWindow)));
        }
        public BaseSearchWindow() {
            Uri uri = new Uri("/WPFLibs;component/Resources/StyleResources.xaml", UriKind.Relative);
            ResourceDictionary Dict = Application.LoadComponent(uri) as ResourceDictionary;
            this.Style = Dict["WindowTemplate"] as Style;
        }

Чем я хочу найти элемент управления в шаблоне элемента управления:

 public override void OnApplyTemplate() {

                RibbonCommand searchCommand = this.Template.FindName("searchCommand", this) as RibbonCommand;
               //doesn't work, searchCommand is null
                searchCommand.CanExecute += CanExecuteRibbonCommand;
    }

Но это всегда ноль. Я попробовал это в унаследованном классе, и это работает, но я хочу это в своем базовом классе, поэтому мне не нужно искать его каждый раз, когда я использую этот класс. Это работает:

public partial class MainWindow : BaseSearchWindow {
        public MainWindow() {
            InitializeComponent();
            RibbonCommand searchCommand = this.Template.FindName("searchCommand", this) as RibbonCommand;
            searchCommand.CanExecute += CanExecuteRibbonCommand;

        }   

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Использование FindName в OnApplyTemplate является правильным способом сделать это;Я думаю, что это не работает, потому что вы забыли позвонить base.OnApplyTemplate().

0 голосов
/ 08 апреля 2011

На самом деле, я допустил ошибку. Когда я пытаюсь найти элементы управления, которые не являются RibbonCommands, это сработало, так что теперь я сначала нахожу родительский элемент управления, а затем использую VisualTreeHelper, чтобы найти RibbonCommand. Извините, я был убежден, что это сработало только в расширенном классе, но, думаю, я слишком устал, когда отправил вопрос. В любом случае спасибо за вашу помощь.

0 голосов
/ 07 апреля 2011

Моя ставка в том, что вы ищете команду, которая не существует (или имеет другое имя) или не является RibbonCommand.

Это или вы не указали x:FieldModifier="protected" длякоманда в xaml.

...