Нажать кнопку из Generic.xaml?

#c# #silverlight #xaml

#c# #silverlight #xaml

Вопрос:

Я пишу пользовательский элемент управления в Silverlight, и у меня возникают проблемы с получением моей кнопки для перехода к файлу Generic.xaml. Это не работает:

     <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ScrollableTabControl">
                    <Button Grid.Row="0" Grid.Column="0" x:Name="ScrollLeft" Click="scrollLeft">amp;<</Button>
            </ControlTemplate>
        </Setter.Value>
  

«scrollLeft» находится в моем файле C #.

Однако это тоже не работает:

         var b = this.GetTemplateChild("ScrollLeft");
        Debug.Assert(b != null);
  

Потому что независимо от того, что я делаю, b всегда возвращает значение null. Я чувствую, что должен быть простой способ назначить метод щелчка для этой кнопки, так что я делаю не так?

РЕДАКТИРОВАТЬ: Это метод из моего файла C #:

     public void scrollLeft(object sender, RoutedEventArgs e)
    {
        //var scroller = Application.Current.Resources["TabScroller"] as ScrollViewer;
        //scroller.LineLeft();
    }
  

Комментарии:

1. Где ваш код (включая имя метода) для обработчика события щелчка?

2. Я отредактировал его, чтобы теперь у него было это.

Ответ №1:

Вы должны переопределить OnApplyTemplate() в вашем пользовательском классе управления (файл C #).

Вот так.

     public override void OnApplyTemplate()
    {
        Button btn = GetTemplateChild("ScrollLeft") as Button;
        Debug.Assert(btn != null);
    }
  

Кроме того, вам нужно внести еще одно изменение в шаблон элемента управления в Generic.Xaml, как показано ниже.

 <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Button Grid.Row="0" Grid.Column="0" x:Name="ScrollLeft">amp;<</Button>
                </Border>
            </ControlTemplate>
        </Setter.Value>
  

Примечание: Я удалил обработчик события щелчка.

Комментарии:

1. Пожалуйста, имейте в виду, что разработчикам теперь необходимо добавить элемент управления Button с именем scrollLeft в любой настраиваемый шаблон. Отладка. Assert хорош для отладочных версий класса, но не решит эту проблему при выпуске этого кода. Таким образом, проверка if(btn != null) { ... } может быть в порядке.

2. @Emo, Да, ты прав. В производственном коде требуется проверка. Если дизайнер пропустил элемент управления, то это, вероятно, привело бы к исключению NullReference.

Ответ №2:

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

Комментарии:

1. Вы имеете в виду изменение «Click =»scrollLeft» на Command =»scrollLeft»? Потому что оба они по-прежнему возвращают одну и ту же ошибку. «Результат E_FAIL был возвращен из вызова COM-компонента»

2. Ах. Теперь я понимаю вашу проблему. Вы не можете назначить щелчок (или любое другое событие) подобным образом. Переопределите OnApplyTemplate и выполните поиск элемента управления, а затем присоедините обработчик или команду. silverlightshow.net/items /…

3. Спасибо! Я понимаю, о чем вы сейчас говорите.