Попробуйте следующее:
func drawText(context: CGContextRef, text: NSString, attributes: [String: AnyObject], x: CGFloat, y: CGFloat) -> CGSize {
let font = attributes[NSFontAttributeName] as UIFont
let attributedString = NSAttributedString(string: text, attributes: attributes)
let textSize = text.sizeWithAttributes(attributes)
// y: Add font.descender (its a negative value) to align the text at the baseline
let textPath = CGPathCreateWithRect(CGRect(x: x, y: y + font.descender, width: ceil(textSize.width), height: ceil(textSize.height)), nil)
let frameSetter = CTFramesetterCreateWithAttributedString(attributedString)
let frame = CTFramesetterCreateFrame(frameSetter, CFRange(location: 0, length: attributedString.length), textPath, nil)
CTFrameDraw(frame, context)
return textSize
}
И назовите это:
var textAttributes: [String: AnyObject] = [
NSForegroundColorAttributeName : UIColor(white: 1.0, alpha: 1.0).CGColor,
NSFontAttributeName : UIFont.systemFontOfSize(17)
]
drawText(ctx, text: "Hello, World!", attributes: textAttributes, x: 50, y: 50)
Надеюсь, что это сработает!
Смотрите на RoutedCommands.
Определите свою команду в myclass где-нибудь следующим образом:
public static readonly RoutedCommand Login = new RoutedCommand();
Теперь определите свою кнопку с этой командой:
<Button Command="{x:Static myclass.Login}" />
Можно использовать CommandParameter для получения дополнительной информации..
Теперь наконец, что не менее важно, начните слушать свою команду:
В конструкторе класса Вы хотите сделать некоторый хороший материал, Вы помещаете:
CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));
или в XAML:
<UserControl.CommandBindings>
<CommandBinding Command="{x:Static myclass.Login}" Executed="ExecuteLogin" />
</UserControl.CommandBindings>
И Вы реализуете делегата потребности CommandBinding:
private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
{
//Your code goes here... e has your parameter!
}
Можно начать слушать эту команду везде в визуальном дереве!
Надеюсь, это поможет
PS можно также определить CommandBinding с делегатом CanExecute, который даже отключит команду, если CanExecute заявит так :)
PPS Здесь является другим примером: RoutedCommands в WPF
Как отправленный Арктур, RoutedCommands являются отличным способом достигнуть этого. Однако, если существует только одна кнопка в Вашем DataTemplate затем, это могло бы быть немного более просто:
Можно на самом деле обработать событие Click любой кнопки от хоста ListBox, как это:
<ListBox Button.Click="removeButtonClick" ... />
Любые кнопки, содержавшие в ListBox, запустят то событие, когда на них нажмут. Из обработчика событий можно использовать e. OriginalSource для возвращения ссылки на кнопку, на которую нажали.
Очевидно, это слишком упрощенно, если Ваши ListBoxItems имеют больше чем одну кнопку, но во многих случаях она работает просто великолепно.
Вы могли создать пользовательский элемент управления (.ascx) для корпуса поля списка. Затем добавьте общественное мероприятие для страницы.
Public Event btnRemove()
Затем на событии нажатия кнопки в usercontrol
RaiseEvent btnRemove()
Можно также передать объекты через событие точно так же, как любой другой метод. Это позволит Вашему пользовательскому элементу управления говорить Вашу страницу, что удалить.