技术开发 频道

Windows phone入门开发问答三十则

  问题二十一:我在一个线程中调用如下代码,但是当到了 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
相关文章