#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. Спасибо! Я понимаю, о чем вы сейчас говорите.