当前位置:编程学习 > wap >>

Windows Phone自定义控件出错

在一个小app上需要用到一个usercontrol,之前用WPF做了一个,用起来都正常,后来在Windows Phone上做一个时,调试时IDE报错,错误提示  "exception was unhandled  0x8000ffff"



下面是部分代码

DependencyProperty
1  public string City
 2         {
 3             get
 4             {
 5                 return (string)this.GetValue(CityProperty);
 6             }
 7             set
 8             {
 9                 SetValue(CityProperty, value);
10             }
11         }
12 
13         public static DependencyProperty CityProperty = DependencyProperty.Register("City", typeof(string), typeof(CitySummary), new PropertyMetadata("N/A"));



1 public CitySummary()
 2         {
 3             InitializeComponent();
 4 
 5             Binding cityBind = new Binding();
 6             cityBind.Source = this;
 7             cityBind.Path = new PropertyPath(CitySummary.CityProperty);
 8             txtCity.SetBinding(TextBlock.TextProperty, cityBind);
 9 
10         }


UserControl的XAML

1 <UserControl x:Class="NailClipper.Toolkits.CitySummary"
 2     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6     mc:Ignorable="d"
 7     FontFamily="{StaticResource PhoneFontFamilyNormal}"
 8     FontSize="{StaticResource PhoneFontSizeNormal}"
 9     Foreground="{StaticResource PhoneForegroundBrush}"
10     d:DesignHeight="170" d:DesignWidth="200">
11     
12     <Grid x:Name="LayoutRoot" >
13         <Grid.RowDefinitions>
14             <RowDefinition Height="114"/>
15             <RowDefinition Height="56"/>
16         </Grid.RowDefinitions>
17         <Canvas Background="Black" Opacity="0.15" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Grid.RowSpan="2">
18             
19         </Canvas>
20         <Grid Margin="0">
21             <Grid.ColumnDefinitions>
22                 <ColumnDefinition Width="87"/>
23                 <ColumnDefinition Width="113"/>
24             </Grid.ColumnDefinitions>
25             <TextBlock Name="txtCity"  VerticalAlignment="Top" Margin="10,12,0,0"  Foreground="{StaticResource PhoneForegroundBrush}" />
26             <Image Name="imgPath" Grid.Column="1" Margin="10,8,8,10"  />
27         </Grid>
28         <StackPanel Margin="0" Grid.Row="1">
29             <TextBlock Name="txtTemperature"  Margin="10,0,0,0" Foreground="{StaticResource PhoneForegroundBrush}" />
30             <TextBlock Name="txtCondition"  Margin="10,0,0,0" Foreground="{StaticResource PhoneForegroundBrush}" />
31         </StackPanel>
32     </Grid>
33 </UserControl>


页面调用UserControl  wpCityList是一个WrapPanel

 1             Thickness margin = new Thickness(0, 0, 5, 10);
 2             
 3             CitySummary city1 = new CitySummary { City = "长春", Temperature = "10°/15°", Condition = "多云", ImagePath = "/NailClipper.Weather;component/Images/多云D.png" };
 4             city1.Margin = margin;
 5             city1.MouseLeftButtonDown += new MouseButtonEventHandler(city1_MouseLeftButtonDown);
 6 
 7             CitySummary city2 = new CitySummary { City = "宿迁", Temperature = "25°/35°", Condition = "晴", ImagePath = "/NailClipper.Weather;component/Images/晴D.png" };
 8             city2.Margin = margin;
 9             city2.MouseLeftButtonDown += new MouseButtonEventHandler(city1_MouseLeftButtonDown);
10 
11             CitySummary city3 = new CitySummary { City = "北京", Temperature = "15°/25°", Condition = "小雨", ImagePath = "/NailClipper.Weather;component/Images/小雨D.png" };
12             city3.Margin = margin;
13             city3.MouseLeftButtonDown += new MouseButtonEventHandler(city1_MouseLeftButtonDown);
14 
15             
16             wpCityList.Children.Add(city1);
17             wpCityList.Children.Add(city2);
18             wpCityList.Children.Add(city3);


运行调试的时候就报错了,不知道怎么回事,求解~谢了各位 --------------------编程问答-------------------- 一、 控件分类

让我们先从我们熟悉的控件分类开始,因为这样理解更直观。

WP7里基本控件可以分为以下四类:

1.         文本控件:主要用于显示和输入文本

2.         内容控件:主要用于包含一个子控件元素UIElement(UIElement是所有可视UI控件的基类,我叫它第三代控件祖宗)

3.         项集合控件:从名字可以知道,它是包含有多个子项的控件,如ListBox

4.         容器控件:它可以包含有多个子控件元素(UIElement)

 

如下表所示,常用基本控件。


控件
 
控件类型
 
内容属性
 

TextBlock
 
文本控件
 
TextBlock.Text

TextBlock.Inlines
 

TextBox
 
文本控件
 
TextBox.Text
 

PasswordBox
 
文本控件
 
PasswordBox.Password
 

Button
 
内容控件
 
ContentControl.Content
 

CheckBox
 
内容控件
 
ContentControl.Content
 

RadioButton
 
内容控件
 
ContentControl.Content
 

ListBoxItem
 
内容控件
 
ContentControl.Content
 

ListBox
 
项集合控件
 
ItemsControl.Items

ItemsControl.ItemsSource
 

Canvas
 
容器控件
 
Panel.Children
 

Grid
 
容器控件
 
Panel.Children
 

StackPanel
 
容器控件
 
Panel.Children
 

 原创地址: http://blog.csdn.net/mr_raptor/article/details/7251942

二、主要控件基类

System.Windows.Controls命名空间下,包含以下几个主要的控件基类:
•Control
•ContentControl
•ItemsControl
•Panel

1. Control:表示用户界面控件的基类

 



 

主要属性:
•Control.Template 属性:

  通过将ControlTemplate应用给Control.Template 属性来定义其外观。所有继承自Control类的子类,都继承Template属性,也就意味着,你可以通过自定义ControlTemplate来实现Control子控件的自定义。

注意:它有一个子类UserControl,用于快速创建控件,不过,你不能自定义ControlTemplate,并将它应用于UserControl。

 

主要事件:
•GotFocus,LostFocus 

当控件获得或失去焦点时回调
•  MouseLeftButtonUp ,MouseMove ,MouseLeftButtonDown

当控件被点击,移动时分别回调
•  ManipulationStarted ,ManipulationDelta, ManipulationCompleted

当用户对控件开始进行操作时回调ManipulationStarted,当用户对控件操作并更改位置时回调ManipulationDelta,当用户对控件停止操作时,回调ManipulationCompleted。
• SizeChanged

当代表控件大小的ActualHeight 或 ActualWidth属性改变时回调

 

2. ContentControl:是其他内容控件的基类,表示包含单项元素的内容控件。像 Button、CheckBox 和 ScrollViewer 这样的控件直接或间接继承自该类。



 

主要属性:
•ContentControl. Content 属性:

  ContentControl.Content 属性可以是任何类型的对象,例如字符串、UIElement 或 DateTime。当ContentControl.Content 设置为 UIElement 时,ContentControl 中将显示 UIElement。当ContentControl.Content 设置为其他类型的对象时,ContentControl 中将显示该对象的字符串表示形式。

注意:ContentControl 具有有限的默认样式。如果要增强该控件的外观,可以创建新的 DataTemplate类型属性用于自定义。
• ContentControl. ContentTemplate属性:

它是一个DataTemplate对象元素,定义该ContentControl的内容显示外观。

 原创地址: http://blog.csdn.net/mr_raptor/article/details/7251942

3. ItemsControl:是项集合类的基类。



 

主要属性:
•Items属性:

如果要显示固定列表,则应当用一个或多个 FrameworkElement 子对象填充ItemsControl .Items属性,并且不要指定ItemsSource。
•ItemsSource属性:

如果要显示对象数据源中的数据,则应将ItemsSource指定为对某个对象的引用。 通常,这可通过 Binding 声明来实现,
•ItemsPanel属性:

设置该属性来自定义项集合控件的布局方式,是一个ItemsPanelTemplate类型元素。
•ItemTemplate属性:

设置该属性来指定项集合控件中,每一个Item项的数据显示外观,是一个DataTemplate类型元素。

 

4. Panel: 是容器控件的基类,比如:Canvas, Grid, StackPanel。

 



 

自定义布局行为可以通过以下方式来实现:从 Panel 继承并使用 MeasureOverride 和 ArrangeOverride 方法重写默认度量和排列行为。

原创地址: http://blog.csdn.net/mr_raptor/article/details/7251942

上面解释的基类中的主要属性和方法是我们在自定义控件时去修改的东西,通过中间的继承关系图可以看得出,Panel类与Control类没有任何继承关系,这也就从祖宗这辈上决定了其孩子的特性不一样,所以在对两个大分支类进行自定义时不一样,Panel类主要是包含其它控件的容器控件,对容器控件的主要自定义就是设置不同的被包含控件之间的布局,因此重载其两个测量方法。而Contorl类是用户交互类,有外观,有交互操作,对其子类主要是自定义其外观和操作,也就是说,通过设置其Template属性和重载具体的事件来达到目的。
•ContentControl类是Control类的子类,它有Control的特点,不过,它是内容控件,主要用来包含一个UIElement。
•既然包含一个UIElement,就要设置这个UIElement的内容,即:Content属性。
•通过ContentTempalte来定义这个被包含的UIElement的外观,因此,如果要自定义外观那就是重新创建新的DataTempalte,应用到ContentTempalte属性喽。
•ItemsControl类是Control类的子类,同样继承了该继承的东西,它是个项集合类,可以包含多个子项Item。
•它有Items属性和ItemsSource让用户来指定包含哪些子项。
•各子项之间要怎样布局,就有了ItemtPanel属性用来让用户指定。
•每一个子项是一个内容控件,它具有ContentControl的特点,因此还要通过ItemTempalte属性指定每一个项的外观。
--------------------编程问答-------------------- wpf的控件不能直接无改动移植到wp上的
补充:移动开发 ,  Windows Phone
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,