首页 > 代码库 > [Xamarin] button及事件处理

[Xamarin] button及事件处理

在visual studio + Genymobile 的调试环境下,遇到连不上虚机的情况,在Xamarin官方论坛上找到解决方案,如下:

主要就是去android的project属性调整几个值

Couldn‘t connect to logcat, GetProcessId returned: 0

Open your application properties Android Manifest -->Required Permission -->Enable ACCESS_COARSE_LOCATION and INTERNET(tick) Android Options --> Supported Architecture -->Enable armeabi and armeabi-v7a

Button,昨天的都是一些显示相关的基础控件,button算是第一个交互控件,示例代码如下,绑定事件即可用,C#码农在VS下tab两下自动就生成对应事件函数啦~

Button的properties并不是每个都支持所有平台(iOS Android WP),需要参考下API doc

示例的结构:首先还是新建一个继承contentPage的类,最外层用的是StackLayout,直接赋值到content属性上。StackLayout按顺序放一个button和ScrolView,ScrolView再包含一个预先定义成field的StackLayout用来存放之后动态生成的Label,button的click事件里实现动态添加一个Label到LoggerLayout里

    class ButtonLoggerPage: ContentPage
    {
        StackLayout loggerLayout = new StackLayout();

        public ButtonLoggerPage()
        {
            //Create the Button and attach Clicked handler
            Button button = new Button
            {
                Text = "Log the Click Time"
            };
            button.Clicked += button_Clicked;

            this.Padding = new Thickness(5,Device.OnPlatform(20,0,0),5,0);

            //Assemble the page
            this.Content = new StackLayout
            {
                Children =
                {
                    button,
                    new ScrollView
                    {
                        VerticalOptions = LayoutOptions.FillAndExpand,
                        Content = loggerLayout
                    }
                }
            };
        }

        void button_Clicked(object sender, EventArgs e)
        {
            //Add Laabel to scrollable StackLayout
            loggerLayout.Children.Add(new Label { 
                Text = "Button clicked at" + DateTime.Now.ToString("T")
            });
        }
    }

效果如下,其中button在点击的时候,背景色会改变:

walking the tree

类似HTML 或 XAML,控件之间可以通过visual tree查询,上面例子的事件处理函数中,直接使用了loggerLayout变量,也可以通过sender参数找过去,示例如下

            //another way to find loggerLatout
            Button button = (Button)sender;
            StackLayout outerLayout = (StackLayout)button.ParentView;
            //second one is scrollView
            ScrollView scrollView = (ScrollView)outerLayout.Children[1];
            StackLayout loggerLayout_2 = (StackLayout)scrollView.Content;

例子主要用来说明visual tree的使用,就示例本身来说,来回的强制转换肯定影响性能,同时如果改变了layout结构,相应的代码也要调整,不过还没有去查API有没有支持find by id之类的方式

Sharing button clicks

这个和C#里大多数事件处理机制相同,把多个控件的click事件绑定(+=)到同一个处理函数即可

Anonymous event handlers

使用C#的Lambda特性实现匿名事件函数,示例:

button.Clicked += (sender,args) =>
    {
        //statement
    }

Distinguishing views with IDs

Element 基类定义了一个string类型的StyleId,用来设置用户自定义的id,有点value/tag的意思吧

所以普通的button控件都可以设置这个值

    public abstract class Element : BindableObject, IElement, INameScope
    {
        //
        // Summary:
        //     Gets or sets a user defined value to uniquely identify the element.
        //
        // Remarks:
        //     Use the StyleId property to identify individual elements in your application
        //     for identification in ui testing and in theme engines.
        public string StyleId { get; set; }


明天进入 Infrastructure部分!!



[Xamarin] button及事件处理