技术开发 频道

Windows phone入门开发问答三十则

  【IT168技术】随着windows phone越来越多的被开发者关注,windows phone的入门开发成了开发者最为关注的问题,除了搭建环境,调试实例程序之外,真正的动手开发对于入门级别的开发者来说也是个问题,因此IT168移动开发频道专门从各个论坛和社区为大家搜集到了一些关于入门开发的一些问题,进行了整理,希望能够给开发者带来一定的帮助。

  问题一:Windows Phone 7上好像无法使用 NavigationService.RemoveBackEntry()。

  使用场景:

  1. 从登录页面登录成功后进入主页,这时不希望用户按返回键后返回到登录页。(如何操作呢)

  2. 从一个页面导航到另一个页面。由于某种原因不想用户返回键后返回到上一个页面。(如何操作呢)

  答案:不能控制page栈。第一个问题困扰了我很久,很难想出完美的方法,后来取消了app运行时直接进入登录页面,改在主页面中增加一个“登录”选项来跳转到登录页面。

  问题二:

  1.我建了一个类。 类中有几个成员属性为字符串类型。

  2.从网络上请求到数据,并把数据放到该类的List中。

  3.程序Tombstone,把列表保存到Page.State(State可以保存任何类型)。

  4.从Page.State中读数据,读出来每个ListItem中的成员属性都为空,这是为什么?如果单独只保存一个Item,读出来的成员属性都是正确的。

  答案:把它拆装为string或者int保存,当激活时,再将string或者int组装回item

  问题三:如何变换page的Content?

  1. 现在做了两个UserControl用做Page的Content.

  2. 先在页面中加入第一个UserControl.

  3. 当第一个UserControl做完一件事后, Page自动把Content换成第二个UserControl

  答案:在UserControl1中定义一个事件或者普通的委托,在其完成网络请求后,调用这个委托。

  在Page中设置UserControl1的委托的处理逻辑,也就是设置Content即可。

  问题四:关于UserControl的问题:

  我想在一个页面中弹出一个Popup,Popup的内容是一个自己绘制的UserControl,有三个按钮。三个按钮分别要向三个页面跳转并发消息,可是系统中只有Page才有导航的功能,UserControl没有。要怎么解决这个问题?

  答案:在UserControl里开个事件 Page里面写事件内容。

  问题五:Panorama的title与PanoramaItem的header大小能改吗?

  答案:都可以修改。只需要编辑它们对应的TitleTemplate和HeaderTemplate就可以了。不过建议不要修改其高度,保证用户体验的一致性。

  问题六:我需要在一个控件上显示一个滚动的文本, 比如定时器来了让这个文本滚动一个像素。这样,我需要把这个文本先画到buffer上, 然后把buffer 从位置 X1 到 X2 刷新到屏幕上或者一个控件上,在Phone7里面该怎么做呢?

  答案:移动TextBlock也可以,这样做似乎也比较方便,我写了一个,看看效果可以不?

1.    <Canvas x:Name="canvas1" Background="Yellow">
2.        <Canvas.Clip>
3.            <RectangleGeometry Rect="50,50, 350,50" />
4.        </Canvas.Clip>
5.        <Canvas.Triggers>
6.            <EventTrigger RoutedEvent="Canvas.Loaded" >
7.                <BeginStoryboard>
8.                    <Storyboard x:Name="sttorybord1" Storyboard.TargetProperty="(Canvas.Left)" RepeatBehavior="Forever" >
9.                        <DoubleAnimation Storyboard.TargetName="textBlock1" From="50" To="-500" Duration="0:0:10"  />
10.                    </Storyboard>
11.                </BeginStoryboard>
12.            </EventTrigger>
13.        </Canvas.Triggers>
14.        <TextBlock x:Name="textBlock1"  FontSize="36" Foreground="Green" Text="abcdefghijklmnopqrstuvwxyz" Canvas.Top="50" Width="550" Height="50"/>
15.    </Canvas>

  问题七:使用MediaPlayerLauncher播放在线视频时,无法做快进和快退(视频都缓冲完成)。本地视频却可以。 难道是MediaPlayerLauncher现在功能不完善?因为MediaElement和MediaPlayerLauncher功能是一样的。 那MediaElement能不能做无法做快进和快退?

  答案:Location = MediaLocationType.Data;就行了。

  问题八:一个页面分为上, 中, 下三个部分。每一个部分里面还有布局。我能不能写三个资源分别对应上,中,下三个部分。 再把三个资源放在一个Grid里。怎么做呢?

  答案:先在那个主Gird,通常情况下默认名称为ContentPanel,先把它划分为三部分,通过RowDefinition或在其设计界面中划分。

  这三部分再分别放置楼主需要的布局控件,比如再放置Grid、StackPanel等,按照需要就随意在里面放控件了。

  问题九:textbox的keydown事件,为什么不响应退格键啊。难道要写个textbox的子类再重载onKeyDown吗?

  答案:只有连续按退格键直到TextBlock的顶部左边缘时(也就是删除掉其中的第一个字符时)才会触发一次KeyDown !

  问题十:xmal代码如下:

<TextBox Height="85" HorizontalAlignment="Left"  Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="192"  VerticalScrollBarVisibility="Visible" TextWrapping="Wrap" AcceptsReturn="True" />

  我用普通的silverlight application试了一下,一点问题没有,可是为什么phone7的工程就不行呢?写了多少行都没有滚动条出来,

  答案:最简单的办法,套个ScrollView

  <ScrollViewer Height="136" HorizontalAlignment="Left"  Name="scrollViewer1" VerticalAlignment="Top" Width="367">
3.                    <TextBox Name="textBox1"  AcceptsReturn="True" VerticalScrollBarVisibility="Visible" TextWrapping="Wrap"  />
4.                </ScrollViewer>
5.            </Grid>

        问题十一:如何捕获网络访问发生的错误事件,取得代码?有大侠做过吗?

  答案:只能解析WebBrowser的内容。通过WebBrowser的SaveToString方法获取返回的HTML。

  问题十二:RT,不要弹出式的,一打开界面,键盘就能显示在屏幕上要怎么实现?

  答案:页面load时,加个textbox.Focus();

  问题十三:1\使用ListBox中包含button.

  2、在Button中增加Click事件;

  虽然能触发Click消息,但是程序无法获知用户点击的是那行数据。

private void Button_Click(object sender, RoutedEventArgs e) {
            
object o = listBox1.SelectedItem;
            
if (o != null) {    //这里都是Null
                Type t
= o.GetType();
                MessageBox.Show(o.ToString());
            }
        }

  listBox中增加的button代码如下:

<ListBox Height="475" HorizontalAlignment="Left" Margin="12,0,0,6" Name="listBox1" VerticalAlignment="Bottom" Width="438">
                
<ListBox.ItemTemplate>
                    
<DataTemplate>
                        
<Button Width="438" Height="120" KeyUp="Button_KeyUp" Click="Button_Click" MouseLeftButtonUp="Button_MouseLeftButtonUp">
                            
<Button.Content>
                                
<StackPanel Orientation="Horizontal" Height="85">
                                
<Image Source="{Binding ImageUrL}" Width="80" Height="80"/>
                                
<StackPanel >
                                    
<TextBlock Margin="8" Width="380" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left"
                                               Text
="{Binding Name}"/>
                                
</StackPanel>
                                
</StackPanel>
                            
</Button.Content>
                        
</Button>
                    
</DataTemplate>
                
</ListBox.ItemTemplate>
            
</ListBox>

  答案:如果有DataBinding的话直接取Button的DataContent就行了

  如果一定要index的话,可以这么来:

var a = sender as Button;
var b
= System.Windows.Media.VisualTreeHelper.GetParent(a);
var c
= System.Windows.Media.VisualTreeHelper.GetParent(b);
var d
= System.Windows.Media.VisualTreeHelper.GetParent(c);
ListBoxItem f
= System.Windows.Media.VisualTreeHelper.GetParent(d) as ListBoxItem;
int index =listBox1.ItemContainerGenerator.IndexFromContainer(f);

  上面VisualTreeHelper.GetParent楼主可以调试一次就知道几次能找到ListBoxItem了

  问题十四:现在WP能把GB2312格式的字符串转成utf-8的吗?

  我是这么转的:

  1. byte[] btes = System.Text.Encoding.GetEncoding("GB2312").GetBytes(urlTitle);

  
2. urlTitle = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.GetEncoding("GB2312").GetBytes(urlTitle), 0, btes.Length);

  报错说“GB2312 is not a supported encoding name”.

  有没有其他方法可以转换啊?

  答案:GetEncoding只支持下面四个属性:

utf-8
UTF8Encoding

utf
-16
UnicodeEncoding (Little
-endian)

utf
-16BE
UnicodeEncoding (Big
-endian)

utf
-16LE
UnicodeEncoding (Little
-endian)

  问题十五:如何制作WP7 应moBudget用的视频演示 就像ShoppShopping Timesing Times 或者moBudget的演示视频一样

  答案:Microsoft Expression Studio中有个Encoder可以用来录制屏幕。

  问题十六:想在ListBox的item最底部放个常见的“更多”的按钮,另外一个问题,我比较困惑怎么捕获到listbox向下滚动时,已经滚到最底部的事件。

  答案:其实实现起来很简单,ScrollView中放个ItemsControl,然后检测ScrollView的滚动条位置即可

  问题十七:建立一个Convert 类用函数Convert把一个整数,转化为由几个图片组成的StackPanel并返回。这时如何把这个Convert用到XAML中呢?

  答案:在相应列放一个内容控件(TextBlock之类也行,只要有Content属性即可),然后将其Content属性绑定到你的数字列,并设置其Converter~~~

  问题十八:使用TextBlock如果Text内容很长,就会出现下文字被截断的问题。后改用TextBox,但是如果设置TextBox为只卖属性,就会有一个灰色的背景色,怎么办呢?

  答案:在Silverlight中,控件的大小为2048*2048,所以现改用scrollerview+stackpanel来显示,

  问题十九:在Start菜单上的小瓷片上,微软官方视频是有一个在小瓷片上显示短信数量,未接电话数量的数字。这个Live Title怎么能弄出来呢?

  答案:在应用程序列表长按应用程序图标,在弹出菜单中选择“Pin to Start”就可以添加你的应用程序的Tile了。

  要显示数字,在项目下打开“Properties\WMAppManifest.xml”文件,将“Tokens”节点下的“Count”改为改为一个非0的数字,瓷片上就会显示数字了。当然这个是固定数字,要动态更新数字目前只能用Push Notification.如果只是更新背景图片的话,还可以用瓷片更新计划。

  问题二十:

this.NavigationService.Navigate(new Uri("/Page1.xaml?pagetitle=hello", UriKind.Relative));          
  this.PageTitle.Text  
= NavigationContext.QueryString["pagetitle"].ToString();  

  有没有类似APPLICATION的全局的?

  答案:可以用应用程序状态,Application.State.

  PhoneApplicationService.Current.State["key"] = "value";

  问题二十一:我在一个线程中调用如下代码,但是当到了 BitmapImage Coverbmp = new BitmapImage();就报Invalid cross-thread access错误,但是我想在后台慢慢加载独立信息里的图片,做为缓冲图,这怎么办呢?

  答案:Dispatcher.BeginInvoke

  问题二十二:今天在全景视图中定义了一个ListBox,并且写了这个ListBox的SelectionChanged。

  在SelectionChanged事件函数中仅写了一个NavigationService的页面跳转。当我第一次选择一个ListBox中的Item时页面可以正常跳转。

  可是当我从跳转后的页面回到主页面时会自动再次触发SelectionChanged事件,并且选中的SelectedIndex为0xffffff(全是f,几位我记不清了)然后我重写了跳转后页面的BackKeyPress,用NavigationService直接跳转至主页面,这个时候没有问题。请问这是什么原因呢?有朋友有类似情况么?

  答案:BackKeyPress 和行为机制好像不能重写,这是系统功能。如果这个可以重写,那就有可能造成用户点击返回不能退出程序,这样就成流氓软件了。

  标准用法如下:

ListBox apps = (ListBox)sender;

// If selected index is -1 (no selection) do nothing
if (apps.SelectedIndex == -1)
    return;        
// Navigate to the Application Details Page
        
// Reset selected index to -1 (no selection)
apps.SelectedIndex
= -1;

  问题二十三:Panorama全景视图控件里放置一张图片,点击图片跳转到另一个页面,问题是如何判断点击在图片上的一个滑动动作,是一个滑动事件,而不是点击事件。

  答案:在全景视图页上,按钮上的滑动不会触发Click事件,可以放心的在Click事件中导航,无需判断。

  或者直接用HyperLinkButton也行。

  在按钮或HyperLinkButton中嵌入你的图片。

1.      <HyperlinkButton  Height="129" HName="hyperlinkButton1"  Width="381" NavigateUri="/Page1.xaml"  Background="#FFCB8787" >
2.                         <Image .... />
3.                 </HyperlinkButton>

  问题二十四:模拟器都看不一个文件,也找不到相应的文章。

  答案:1. 你的程序只能看到自己的独立存储里面的文件

  2. 通过http协议和你的服务器通讯传递文件

  问题二十五:如果用wp7拍照或摄像,那么这些资源都存放在什么地方呢?如何用代码访问到这些空间呢?

  答案:默认放在MediaLibrary中,一般可以通过MediaLibrary类访问,图片还可以通过PhotoChooserTask访问。

  MediaLibrary library = new MediaLibrary();

  问题二十六:默认状态下,点击ListBox的某项文字行后,选中行的颜色会自动变成蓝色(选中状态),现在我想改变选中状态的颜色,不知道能不能通过样式来改。

  答案:

<ControlTemplate TargetType="Button">
  
<Border x:Name="RootElement">

    
<VisualStateManager.VisualStateGroups>

      
<!--Define the states for the common states.
          The states in the VisualStateGroup are mutually exclusive
to
          
each other.-->
      
<VisualStateGroup x:Name="CommonStates">

        
<!--The Normal state is the state the button is in
            when it
is not in another state from this VisualStateGroup.-->
        
<VisualState x:Name="Normal" />

        
<!--Change the SolidColorBrush, BorderBrush, to red when the
            mouse
is over the button.-->
        
<VisualState x:Name="MouseOver">
          
<Storyboard>
            
<ColorAnimation Storyboard.TargetName="BorderBrush"
                              Storyboard.TargetProperty
="Color" To="Red" />

          
</Storyboard>

        
</VisualState>

        
<!--Change the SolidColorBrush, BorderBrush, to Transparent when the
            button
is pressed.-->
        
<VisualState x:Name="Pressed">
          
<Storyboard >
            
<ColorAnimation Storyboard.TargetName="BorderBrush"
                              Storyboard.TargetProperty
="Color" To="Transparent"/>
          
</Storyboard>
        
</VisualState>
          
<!--The Disabled state is omitted for brevity.-->
        
</VisualStateGroup>

    
</VisualStateManager.VisualStateGroups>


    
<Border.Background>
      
<SolidColorBrush x:Name="BorderBrush" Color="Black"/>
    
</Border.Background>

    
<Grid Background="{TemplateBinding Background}" Margin="4">
      
<ContentPresenter
        HorizontalAlignment
="{TemplateBinding HorizontalContentAlignment}"
        VerticalAlignment
="{TemplateBinding VerticalContentAlignment}"
        Margin
="4,5,4,4" />

    
</Grid>


  
</Border>
</ControlTemplate>

  问题二十七:在一个Page中加入了一个ListBox并且设置了ItemTemplate,ItemTemplate中只有一个TextBlock。之后我再后台Loaded函数中写入“AlbumListContent.ItemsSource = list;”AlbumListContent为ListBox的Name,list为ObservableCollection对象。

  之后将ListBox中的TextBlock的Text属性进行绑定 Text="{Binding TAlbumInfo.albumCover}"可是最后到界面上没有任何反应啊,list里面是有数据的啊,这个是为什么?

  答案:是不是没有设置数据上下文。

  在PageLoad的时候,把数据集合赋给控件DataContext 属性,如下面的:

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            PivotArticle.DataContext
= App.objMagInfo.ArticleInfos;
        
        }

=============================
UI:
<!--Pivot Control-->
        
<controls ivot x:Name=" ivotArticle"  Title="{Binding Source={StaticResource AppName}}" ItemsSource="{Binding}" TabNavigation="Cycle">
            
<controls ivot.ItemTemplate>
                
<DataTemplate>
                    
<StackPanel >
                        
<ScrollViewer Margin="0,0,0,0" Name="scrollViewerArticleContent" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" HorizontalAlignment="Stretch" Height="700">
                            
<StackPanel>
                                
<Image Name="imgArticleImage" Source="{Binding ArticlePicName}" Stretch="Fill" Width="450" />
                                
<TextBlock Name="txtArticleContent" Text="{Binding ArticleContnet}" TextWrapping="Wrap" FontSize="25" FontFamily="Segoe WP" />
                            
</StackPanel>
                        
</ScrollViewer>
                    
</StackPanel>
                
</DataTemplate>
        
            
</controlsivot.ItemTemplate>  
            
            
<controlsivot.HeaderTemplate>
                
<DataTemplate>
                    
<Grid/>
                
</DataTemplate>
            
</controlsivot.HeaderTemplate>
        
</controlsivot>

  问题二十八:PanoramaItem控件的不同PivotItem,如何添加不同的ApplicationBar

  答案:在Pivot_SelectionChanged事件里控制。

  问题二十九:想在wp7里用XElement,来创建xml树,可是包含不了system.xml.linq,是wp7不支持,还是我少添加了什么东西?如何在wp7里用代码创建xml呢?XmlWriter?

  答案:WP7里面要引用LinQ需添加的引用较多,应该是你少加了引用。

1.    using System.Linq;
2.    using System.Xml;
3.    using System.Xml.Linq;

  当然某些情况下只需引用其中两个即可。

  问题三十:

<controls anorama.Background>
                
<ImageBrush ImageSource=" anoramaBackground.png"/>
            
</controls anorama.Background>

  ImageSource 改成 bind方式 ,代码如何写?

  Imagebrush xx = new imagebrush();

  xx.Imagebrush = new bitmapimage怎么不行?

  答案:

2.     using  System.Windows.Media.Imaging
3.    ImageBrush xx = new ImageBrush();
4.    xx.ImageSource=new BitmapImage(new Uri("/Images/myPicture.png",UriKind.Relative));
5.    myControl.BackGround = xx;

  纠正一下:这不叫Bind,这只是一个动态更换背景的操作而已。

  问题三十一:用blend创建了一个button的xaml文件,想让其他的按钮都是用这个模板。

  创建步骤是:

  在App.xaml文件中添加如下代码:

1.    <Application.Resources>
2.            <!-- Button Style-->
3.            <ResourceDictionary x:Key="BtnStyle">
4.                <ResourceDictionary.MergedDictionaries>
5.                    <ResourceDictionary x:Name="NormalStyle" Source="/MyPhone;component/Assets/Styles/Normal_ButtonStyle.xaml"/>              
6.                </ResourceDictionary.MergedDictionaries>
7.            </ResourceDictionary>
8.    </Application.Resources>

  然后再所需要这个模板的按钮中的模板属性设为

   Template="{StaticResource NormalStyle}

  NormalStyle 是 ControlTemplate 的key值

  现在问题就来了 build的时候出现了如下的警告:

  Warning The resource "NormalStyle" could not be resolved.

  而且并不能所见即所得,也就是添加完代码后并不能立刻看到效果,而要等到运行的时候才能看到效果。这样很不爽有没有什么解决的办法?而且我发现只要放在之间的东西,比如system:String值,都会出现上面的情况?

  答案:这个似乎无法解决。ResourceDictionary.MergedDictionaries应该是在运行时才会生成。试着直接引用你在XAML文件中定义的Style的X:Key而不是ResourceDictionary的x:Name,或许可以。

  问题三十二:如何在wp7中实现tab page 和下拉框控件功能?在wp7的toolBox里好像没这些控件。

  答案:Pivot控件就是用来数据和视图分类的。

  Tab需要点击切换位置的类似按钮来实现,在手机上比较麻烦,而Pivot控件通过水平滑动手指就可以了。

  下拉框该用什么方式代替呢?

  这样可以么,弹出一个新的页面,用一个ListBox,选择之后关闭该页面,将选择的那一项的数据填回需要填写的位置。

  问题三十三:

short a = 1000;
byte[] temp = BitConverter.GetBytes(a);

  这时temp为byte[2]...E803

  但是我用streamWriter.Write(temp);

  我发现数据变成了C3A803

  这时怎么回事?从两个字节变成3个字节了。

        答案:改用BinaryWriter......没问题了.....

0
相关文章